master/fsm_master.c
branchstable-1.5
changeset 2529 c7e1f2616a9d
parent 2522 ec403cf308eb
equal deleted inserted replaced
2528:8bb574da5da2 2529:c7e1f2616a9d
   196  */
   196  */
   197 void ec_fsm_master_state_start(
   197 void ec_fsm_master_state_start(
   198         ec_fsm_master_t *fsm /**< Master state machine. */
   198         ec_fsm_master_t *fsm /**< Master state machine. */
   199         )
   199         )
   200 {
   200 {
       
   201     ec_master_t *master = fsm->master;
       
   202 
   201     fsm->idle = 1;
   203     fsm->idle = 1;
       
   204 
       
   205     // check for emergency requests
       
   206     if (!list_empty(&master->emerg_reg_requests)) {
       
   207         ec_reg_request_t *request;
       
   208 
       
   209         // get first request
       
   210         request = list_entry(master->emerg_reg_requests.next,
       
   211                 ec_reg_request_t, list);
       
   212         list_del_init(&request->list); // dequeue
       
   213         request->state = EC_INT_REQUEST_BUSY;
       
   214 
       
   215         if (request->transfer_size > fsm->datagram->mem_size) {
       
   216             EC_MASTER_ERR(master, "Emergency request data too large!\n");
       
   217             request->state = EC_INT_REQUEST_FAILURE;
       
   218             wake_up_all(&master->request_queue);
       
   219             fsm->state(fsm); // continue
       
   220             return;
       
   221         }
       
   222 
       
   223         if (request->dir != EC_DIR_OUTPUT) {
       
   224             EC_MASTER_ERR(master, "Emergency requests must be"
       
   225                     " write requests!\n");
       
   226             request->state = EC_INT_REQUEST_FAILURE;
       
   227             wake_up_all(&master->request_queue);
       
   228             fsm->state(fsm); // continue
       
   229             return;
       
   230         }
       
   231 
       
   232         EC_MASTER_DBG(master, 1, "Writing emergency register request...\n");
       
   233         ec_datagram_apwr(fsm->datagram, request->ring_position,
       
   234                 request->address, request->transfer_size);
       
   235         memcpy(fsm->datagram->data, request->data, request->transfer_size);
       
   236         fsm->datagram->device_index = EC_DEVICE_MAIN;
       
   237         request->state = EC_INT_REQUEST_SUCCESS;
       
   238         wake_up_all(&master->request_queue);
       
   239         return;
       
   240     }
       
   241 
   202     ec_datagram_brd(fsm->datagram, 0x0130, 2);
   242     ec_datagram_brd(fsm->datagram, 0x0130, 2);
   203     ec_datagram_zero(fsm->datagram);
   243     ec_datagram_zero(fsm->datagram);
   204     fsm->datagram->device_index = fsm->dev_idx;
   244     fsm->datagram->device_index = fsm->dev_idx;
   205     fsm->state = ec_fsm_master_state_broadcast;
   245     fsm->state = ec_fsm_master_state_broadcast;
   206 }
   246 }