diff --git a/TODO b/TODO index 9d4edf0c..e7b0ac42 100644 --- a/TODO +++ b/TODO @@ -8,8 +8,6 @@ $Id$ Version 1.4.0: -* Realtime interface changes: - - SDO access. * Mailbox handler * READMEs for examples. * Remove get_cycles() calls and references to cpu_khz to increase diff --git a/master/fsm_coe.c b/master/fsm_coe.c index 34f3a053..86d3071f 100644 --- a/master/fsm_coe.c +++ b/master/fsm_coe.c @@ -180,10 +180,10 @@ void ec_fsm_coe_dictionary(ec_fsm_coe_t *fsm, /**< finite state machine */ /*****************************************************************************/ /** - Starts to download an Sdo to a slave. + Starts to transfer an Sdo to/from a slave. */ -void ec_fsm_coe_download( +void ec_fsm_coe_transfer( ec_fsm_coe_t *fsm, /**< State machine. */ ec_slave_t *slave, /**< EtherCAT slave. */ ec_sdo_request_t *request /**< Sdo request. */ @@ -191,23 +191,10 @@ void ec_fsm_coe_download( { fsm->slave = slave; fsm->request = request; - fsm->state = ec_fsm_coe_down_start; -} - -/*****************************************************************************/ - -/** - Starts to upload an Sdo from a slave. -*/ - -void ec_fsm_coe_upload(ec_fsm_coe_t *fsm, /**< finite state machine */ - ec_slave_t *slave, /**< EtherCAT slave */ - ec_sdo_request_t *request /**< Sdo request */ - ) -{ - fsm->slave = slave; - fsm->request = request; - fsm->state = ec_fsm_coe_up_start; + if (request->dir == EC_DIR_OUTPUT) + fsm->state = ec_fsm_coe_down_start; + else + fsm->state = ec_fsm_coe_up_start; } /*****************************************************************************/ diff --git a/master/fsm_coe.h b/master/fsm_coe.h index 758aa681..28976ea8 100644 --- a/master/fsm_coe.h +++ b/master/fsm_coe.h @@ -73,8 +73,7 @@ void ec_fsm_coe_init(ec_fsm_coe_t *, ec_datagram_t *); void ec_fsm_coe_clear(ec_fsm_coe_t *); void ec_fsm_coe_dictionary(ec_fsm_coe_t *, ec_slave_t *); -void ec_fsm_coe_download(ec_fsm_coe_t *, ec_slave_t *, ec_sdo_request_t *); -void ec_fsm_coe_upload(ec_fsm_coe_t *, ec_slave_t *, ec_sdo_request_t *); +void ec_fsm_coe_transfer(ec_fsm_coe_t *, ec_slave_t *, ec_sdo_request_t *); int ec_fsm_coe_exec(ec_fsm_coe_t *); int ec_fsm_coe_success(ec_fsm_coe_t *); diff --git a/master/fsm_coe_map.c b/master/fsm_coe_map.c index b1e48b28..0bc352da 100644 --- a/master/fsm_coe_map.c +++ b/master/fsm_coe_map.c @@ -184,7 +184,7 @@ void ec_fsm_coe_map_action_next_dir( ec_sdo_request_address(&fsm->request, fsm->sync_sdo_index, 0); ecrt_sdo_request_read(&fsm->request); fsm->state = ec_fsm_coe_map_state_pdo_count; - ec_fsm_coe_upload(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately return; } @@ -240,7 +240,7 @@ void ec_fsm_coe_map_action_next_pdo( fsm->sync_subindex); ecrt_sdo_request_read(&fsm->request); fsm->state = ec_fsm_coe_map_state_pdo; - ec_fsm_coe_upload(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately return; } @@ -297,7 +297,7 @@ void ec_fsm_coe_map_state_pdo( ec_sdo_request_address(&fsm->request, fsm->pdo->index, 0); ecrt_sdo_request_read(&fsm->request); fsm->state = ec_fsm_coe_map_state_pdo_entry_count; - ec_fsm_coe_upload(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately } @@ -344,7 +344,7 @@ void ec_fsm_coe_map_action_next_pdo_entry( ec_sdo_request_address(&fsm->request, fsm->pdo->index, fsm->pdo_subindex); ecrt_sdo_request_read(&fsm->request); fsm->state = ec_fsm_coe_map_state_pdo_entry; - ec_fsm_coe_upload(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately return; } diff --git a/master/fsm_master.c b/master/fsm_master.c index 3a129997..67e17756 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -402,7 +402,7 @@ int ec_fsm_master_action_process_sdo( fsm->sdo_request = req; fsm->slave = slave; fsm->state = ec_fsm_master_state_sdo_request; - ec_fsm_coe_upload(&fsm->fsm_coe, slave, req); + ec_fsm_coe_transfer(&fsm->fsm_coe, slave, req); ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately return 1; } @@ -444,7 +444,7 @@ int ec_fsm_master_action_process_sdo( fsm->sdo_request = &request->req; fsm->slave = slave; fsm->state = ec_fsm_master_state_sdo_request; - ec_fsm_coe_upload(&fsm->fsm_coe, slave, &request->req); + ec_fsm_coe_transfer(&fsm->fsm_coe, slave, &request->req); ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately return 1; } diff --git a/master/fsm_pdo_config.c b/master/fsm_pdo_config.c index ac1cb810..02d3df02 100644 --- a/master/fsm_pdo_config.c +++ b/master/fsm_pdo_config.c @@ -220,7 +220,7 @@ void ec_fsm_pdo_config_next_pdo( fsm->pdo->index); fsm->state = ec_fsm_pdo_config_state_zero_count; - ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately } @@ -260,7 +260,7 @@ void ec_fsm_pdo_config_add_entry( value, fsm->entry_count); fsm->state = ec_fsm_pdo_config_state_add_entry; - ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately } @@ -326,7 +326,7 @@ void ec_fsm_pdo_config_state_add_entry( fsm->entry_count); fsm->state = ec_fsm_pdo_config_state_entry_count; - ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately return; } diff --git a/master/fsm_pdo_mapping.c b/master/fsm_pdo_mapping.c index 758cefb7..571f23a8 100644 --- a/master/fsm_pdo_mapping.c +++ b/master/fsm_pdo_mapping.c @@ -210,7 +210,7 @@ void ec_fsm_pdo_mapping_next_dir( EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync->index); fsm->state = ec_fsm_pdo_mapping_state_zero_count; - ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately return; } @@ -254,7 +254,7 @@ void ec_fsm_pdo_mapping_add_pdo( fsm->pdo->index, fsm->pdo_count); fsm->state = ec_fsm_pdo_mapping_state_add_pdo; - ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately } @@ -320,7 +320,7 @@ void ec_fsm_pdo_mapping_state_add_pdo( fsm->pdo_count); fsm->state = ec_fsm_pdo_mapping_state_pdo_count; - ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->request); + ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately return; } diff --git a/master/fsm_slave_config.c b/master/fsm_slave_config.c index 0d664945..92a6766e 100644 --- a/master/fsm_slave_config.c +++ b/master/fsm_slave_config.c @@ -451,7 +451,7 @@ void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *fsm /**< slave st fsm->request = list_entry(fsm->slave->config->sdo_configs.next, ec_sdo_request_t, list); ecrt_sdo_request_write(fsm->request); - ec_fsm_coe_download(&fsm->fsm_coe, fsm->slave, fsm->request); + ec_fsm_coe_transfer(&fsm->fsm_coe, fsm->slave, fsm->request); ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately } @@ -480,7 +480,7 @@ void ec_fsm_slave_config_state_sdo_conf( fsm->request = list_entry(fsm->request->list.next, ec_sdo_request_t, list); ecrt_sdo_request_write(fsm->request); - ec_fsm_coe_download(&fsm->fsm_coe, fsm->slave, fsm->request); + ec_fsm_coe_transfer(&fsm->fsm_coe, fsm->slave, fsm->request); ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately return; } diff --git a/master/sdo_request.c b/master/sdo_request.c index 4e7ff2bd..cbbfdde7 100644 --- a/master/sdo_request.c +++ b/master/sdo_request.c @@ -57,6 +57,7 @@ void ec_sdo_request_init( req->data = NULL; req->mem_size = 0; req->data_size = 0; + req->dir = EC_DIR_OUTPUT; req->state = EC_REQUEST_COMPLETE; } @@ -181,6 +182,7 @@ ec_sdo_request_error_t ecrt_sdo_request_error(const ec_sdo_request_t *req) void ecrt_sdo_request_read(ec_sdo_request_t *req) { + req->dir = EC_DIR_INPUT; req->state = EC_REQUEST_QUEUED; } @@ -188,6 +190,7 @@ void ecrt_sdo_request_read(ec_sdo_request_t *req) void ecrt_sdo_request_write(ec_sdo_request_t *req) { + req->dir = EC_DIR_OUTPUT; req->state = EC_REQUEST_QUEUED; } @@ -199,3 +202,5 @@ EXPORT_SYMBOL(ecrt_sdo_request_state); EXPORT_SYMBOL(ecrt_sdo_request_error); EXPORT_SYMBOL(ecrt_sdo_request_read); EXPORT_SYMBOL(ecrt_sdo_request_write); + +/*****************************************************************************/ diff --git a/master/sdo_request.h b/master/sdo_request.h index 1d442ad6..a47733c5 100644 --- a/master/sdo_request.h +++ b/master/sdo_request.h @@ -58,6 +58,9 @@ struct ec_sdo_request { uint8_t *data; /**< Pointer to Sdo data. */ size_t mem_size; /**< Size of Sdo data memory. */ size_t data_size; /**< Size of Sdo data. */ + ec_direction_t dir; /**< Direction. EC_DIR_OUTPUT means downloading to + the slave, EC_DIR_INPUT means uploading from the + slave. */ ec_request_state_t state; /**< Sdo request state. */ }; diff --git a/master/slave_config.c b/master/slave_config.c index 985f6ce5..b688346e 100644 --- a/master/slave_config.c +++ b/master/slave_config.c @@ -709,6 +709,10 @@ ec_sdo_request_t *ecrt_slave_config_create_sdo_request(ec_slave_config_t *sc, kfree(req); return NULL; } + + // prepare data for optional writing + memset(req->data, 0x00, size); + req->data_size = size; list_add_tail(&req->list, &sc->sdo_requests); return req;