master/fsm_slave_config.c
branchstable-1.5
changeset 2123 4c335a1d4db0
parent 2104 330e2d43d3b4
child 2268 5e1d3c9430e0
equal deleted inserted replaced
2122:23414e7559de 2123:4c335a1d4db0
   447         sync.physical_start_address = slave->sii.boot_rx_mailbox_offset;
   447         sync.physical_start_address = slave->sii.boot_rx_mailbox_offset;
   448         sync.control_register = 0x26;
   448         sync.control_register = 0x26;
   449         sync.enable = 1;
   449         sync.enable = 1;
   450         ec_sync_page(&sync, 0, slave->sii.boot_rx_mailbox_size,
   450         ec_sync_page(&sync, 0, slave->sii.boot_rx_mailbox_size,
   451                 EC_DIR_INVALID, // use default direction
   451                 EC_DIR_INVALID, // use default direction
       
   452                 0, // no PDO xfer
   452                 datagram->data);
   453                 datagram->data);
   453         slave->configured_rx_mailbox_offset =
   454         slave->configured_rx_mailbox_offset =
   454             slave->sii.boot_rx_mailbox_offset;
   455             slave->sii.boot_rx_mailbox_offset;
   455         slave->configured_rx_mailbox_size =
   456         slave->configured_rx_mailbox_size =
   456             slave->sii.boot_rx_mailbox_size;
   457             slave->sii.boot_rx_mailbox_size;
   459         sync.physical_start_address = slave->sii.boot_tx_mailbox_offset;
   460         sync.physical_start_address = slave->sii.boot_tx_mailbox_offset;
   460         sync.control_register = 0x22;
   461         sync.control_register = 0x22;
   461         sync.enable = 1;
   462         sync.enable = 1;
   462         ec_sync_page(&sync, 1, slave->sii.boot_tx_mailbox_size,
   463         ec_sync_page(&sync, 1, slave->sii.boot_tx_mailbox_size,
   463                 EC_DIR_INVALID, // use default direction
   464                 EC_DIR_INVALID, // use default direction
       
   465                 0, // no PDO xfer
   464                 datagram->data + EC_SYNC_PAGE_SIZE);
   466                 datagram->data + EC_SYNC_PAGE_SIZE);
   465         slave->configured_tx_mailbox_offset =
   467         slave->configured_tx_mailbox_offset =
   466             slave->sii.boot_tx_mailbox_offset;
   468             slave->sii.boot_tx_mailbox_offset;
   467         slave->configured_tx_mailbox_size =
   469         slave->configured_tx_mailbox_size =
   468             slave->sii.boot_tx_mailbox_size;
   470             slave->sii.boot_tx_mailbox_size;
   474 
   476 
   475         for (i = 0; i < 2; i++) {
   477         for (i = 0; i < 2; i++) {
   476             ec_sync_page(&slave->sii.syncs[i], i,
   478             ec_sync_page(&slave->sii.syncs[i], i,
   477                     slave->sii.syncs[i].default_length,
   479                     slave->sii.syncs[i].default_length,
   478                     NULL, // use default sync manager configuration
   480                     NULL, // use default sync manager configuration
       
   481                     0, // no PDO xfer
   479                     datagram->data + EC_SYNC_PAGE_SIZE * i);
   482                     datagram->data + EC_SYNC_PAGE_SIZE * i);
   480         }
   483         }
   481 
   484 
   482         slave->configured_rx_mailbox_offset =
   485         slave->configured_rx_mailbox_offset =
   483             slave->sii.syncs[0].physical_start_address;
   486             slave->sii.syncs[0].physical_start_address;
   501         sync.physical_start_address = slave->sii.std_rx_mailbox_offset;
   504         sync.physical_start_address = slave->sii.std_rx_mailbox_offset;
   502         sync.control_register = 0x26;
   505         sync.control_register = 0x26;
   503         sync.enable = 1;
   506         sync.enable = 1;
   504         ec_sync_page(&sync, 0, slave->sii.std_rx_mailbox_size,
   507         ec_sync_page(&sync, 0, slave->sii.std_rx_mailbox_size,
   505                 NULL, // use default sync manager configuration
   508                 NULL, // use default sync manager configuration
       
   509                 0, // no PDO xfer
   506                 datagram->data);
   510                 datagram->data);
   507         slave->configured_rx_mailbox_offset =
   511         slave->configured_rx_mailbox_offset =
   508             slave->sii.std_rx_mailbox_offset;
   512             slave->sii.std_rx_mailbox_offset;
   509         slave->configured_rx_mailbox_size =
   513         slave->configured_rx_mailbox_size =
   510             slave->sii.std_rx_mailbox_size;
   514             slave->sii.std_rx_mailbox_size;
   513         sync.physical_start_address = slave->sii.std_tx_mailbox_offset;
   517         sync.physical_start_address = slave->sii.std_tx_mailbox_offset;
   514         sync.control_register = 0x22;
   518         sync.control_register = 0x22;
   515         sync.enable = 1;
   519         sync.enable = 1;
   516         ec_sync_page(&sync, 1, slave->sii.std_tx_mailbox_size,
   520         ec_sync_page(&sync, 1, slave->sii.std_tx_mailbox_size,
   517                 NULL, // use default sync manager configuration
   521                 NULL, // use default sync manager configuration
       
   522                 0, // no PDO xfer
   518                 datagram->data + EC_SYNC_PAGE_SIZE);
   523                 datagram->data + EC_SYNC_PAGE_SIZE);
   519         slave->configured_tx_mailbox_offset =
   524         slave->configured_tx_mailbox_offset =
   520             slave->sii.std_tx_mailbox_offset;
   525             slave->sii.std_tx_mailbox_offset;
   521         slave->configured_tx_mailbox_size =
   526         slave->configured_tx_mailbox_size =
   522             slave->sii.std_tx_mailbox_size;
   527             slave->sii.std_tx_mailbox_size;
   957         ec_fsm_slave_config_t *fsm /**< slave state machine */
   962         ec_fsm_slave_config_t *fsm /**< slave state machine */
   958         )
   963         )
   959 {
   964 {
   960     ec_slave_t *slave = fsm->slave;
   965     ec_slave_t *slave = fsm->slave;
   961     ec_datagram_t *datagram = fsm->datagram;
   966     ec_datagram_t *datagram = fsm->datagram;
   962     unsigned int i, offset, num_pdo_syncs;
   967     unsigned int i, j, offset, num_pdo_syncs;
   963     uint8_t sync_index;
   968     uint8_t sync_index;
   964     const ec_sync_t *sync;
   969     const ec_sync_t *sync;
   965     uint16_t size;
   970     uint16_t size;
   966 
   971 
   967     if (slave->sii.mailbox_protocols) {
   972     if (slave->sii.mailbox_protocols) {
   984             EC_SYNC_PAGE_SIZE * num_pdo_syncs);
   989             EC_SYNC_PAGE_SIZE * num_pdo_syncs);
   985     ec_datagram_zero(datagram);
   990     ec_datagram_zero(datagram);
   986 
   991 
   987     for (i = 0; i < num_pdo_syncs; i++) {
   992     for (i = 0; i < num_pdo_syncs; i++) {
   988         const ec_sync_config_t *sync_config;
   993         const ec_sync_config_t *sync_config;
       
   994         uint8_t pdo_xfer = 0;
   989         sync_index = i + offset;
   995         sync_index = i + offset;
   990         sync = &slave->sii.syncs[sync_index];
   996         sync = &slave->sii.syncs[sync_index];
   991 
   997 
   992         if (slave->config) {
   998         if (slave->config) {
   993             sync_config = &slave->config->sync_configs[sync_index];
   999             const ec_slave_config_t *sc = slave->config;
       
  1000             sync_config = &sc->sync_configs[sync_index];
   994             size = ec_pdo_list_total_size(&sync_config->pdos);
  1001             size = ec_pdo_list_total_size(&sync_config->pdos);
       
  1002 
       
  1003             // determine, if PDOs shall be transferred via this SM
       
  1004             // inthat case, enable sync manager in every case
       
  1005             for (j = 0; j < sc->used_fmmus; j++) {
       
  1006                 if (sc->fmmu_configs[j].sync_index == sync_index) {
       
  1007                     pdo_xfer = 1;
       
  1008                     break;
       
  1009                 }
       
  1010             }
       
  1011 
   995         } else {
  1012         } else {
   996             sync_config = NULL;
  1013             sync_config = NULL;
   997             size = sync->default_length;
  1014             size = sync->default_length;
   998         }
  1015         }
   999 
  1016 
  1000         ec_sync_page(sync, sync_index, size, sync_config,
  1017         ec_sync_page(sync, sync_index, size, sync_config, pdo_xfer,
  1001                 datagram->data + EC_SYNC_PAGE_SIZE * i);
  1018                 datagram->data + EC_SYNC_PAGE_SIZE * i);
  1002     }
  1019     }
  1003 
  1020 
  1004     fsm->retries = EC_FSM_RETRIES;
  1021     fsm->retries = EC_FSM_RETRIES;
  1005     fsm->state = ec_fsm_slave_config_state_pdo_sync;
  1022     fsm->state = ec_fsm_slave_config_state_pdo_sync;