master/master.c
changeset 1535 0c484ee12d89
parent 1530 96629de2202b
child 1538 cf2fa3be6add
equal deleted inserted replaced
1534:4844a8433915 1535:0c484ee12d89
   225     if (ret < 0) {
   225     if (ret < 0) {
   226         ec_datagram_clear(&master->sync_datagram);
   226         ec_datagram_clear(&master->sync_datagram);
   227         EC_ERR("Failed to allocate synchronisation datagram.\n");
   227         EC_ERR("Failed to allocate synchronisation datagram.\n");
   228         goto out_clear_ref_sync;
   228         goto out_clear_ref_sync;
   229     }
   229     }
       
   230 
       
   231     // init sync monitor datagram
       
   232     ec_datagram_init(&master->sync_mon_datagram);
       
   233     snprintf(master->sync_mon_datagram.name, EC_DATAGRAM_NAME_SIZE, "syncmon");
       
   234     ret = ec_datagram_brd(&master->sync_mon_datagram, 0x092c, 4);
       
   235     if (ret < 0) {
       
   236         ec_datagram_clear(&master->sync_mon_datagram);
       
   237         EC_ERR("Failed to allocate sync monitoring datagram.\n");
       
   238         goto out_clear_sync;
       
   239     }
       
   240 
   230     ec_master_find_dc_ref_clock(master);
   241     ec_master_find_dc_ref_clock(master);
   231 
   242 
   232     // init character device
   243     // init character device
   233     ret = ec_cdev_init(&master->cdev, master, device_number);
   244     ret = ec_cdev_init(&master->cdev, master, device_number);
   234     if (ret)
   245     if (ret)
   235         goto out_clear_sync;
   246         goto out_clear_sync_mon;
   236     
   247     
   237 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
   248 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
   238     master->class_device = device_create(class, NULL,
   249     master->class_device = device_create(class, NULL,
   239             MKDEV(MAJOR(device_number), master->index), NULL,
   250             MKDEV(MAJOR(device_number), master->index), NULL,
   240             "EtherCAT%u", master->index);
   251             "EtherCAT%u", master->index);
   259 
   270 
   260     return 0;
   271     return 0;
   261 
   272 
   262 out_clear_cdev:
   273 out_clear_cdev:
   263     ec_cdev_clear(&master->cdev);
   274     ec_cdev_clear(&master->cdev);
       
   275 out_clear_sync_mon:
       
   276     ec_datagram_clear(&master->sync_mon_datagram);
   264 out_clear_sync:
   277 out_clear_sync:
   265     ec_datagram_clear(&master->sync_datagram);
   278     ec_datagram_clear(&master->sync_datagram);
   266 out_clear_ref_sync:
   279 out_clear_ref_sync:
   267     ec_datagram_clear(&master->ref_sync_datagram);
   280     ec_datagram_clear(&master->ref_sync_datagram);
   268 out_clear_fsm:
   281 out_clear_fsm:
   297 #endif
   310 #endif
   298     ec_master_clear_domains(master);
   311     ec_master_clear_domains(master);
   299     ec_master_clear_slave_configs(master);
   312     ec_master_clear_slave_configs(master);
   300     ec_master_clear_slaves(master);
   313     ec_master_clear_slaves(master);
   301 
   314 
       
   315     ec_datagram_clear(&master->sync_mon_datagram);
   302     ec_datagram_clear(&master->sync_datagram);
   316     ec_datagram_clear(&master->sync_datagram);
   303     ec_datagram_clear(&master->ref_sync_datagram);
   317     ec_datagram_clear(&master->ref_sync_datagram);
   304     ec_fsm_master_clear(&master->fsm);
   318     ec_fsm_master_clear(&master->fsm);
   305     ec_datagram_clear(&master->fsm_datagram);
   319     ec_datagram_clear(&master->fsm_datagram);
   306     ec_device_clear(&master->backup_device);
   320     ec_device_clear(&master->backup_device);
  1922     ec_master_queue_datagram(master, &master->sync_datagram);
  1936     ec_master_queue_datagram(master, &master->sync_datagram);
  1923 }
  1937 }
  1924 
  1938 
  1925 /*****************************************************************************/
  1939 /*****************************************************************************/
  1926 
  1940 
       
  1941 void ecrt_master_sync_monitor_queue(ec_master_t *master)
       
  1942 {
       
  1943     ec_datagram_zero(&master->sync_mon_datagram);
       
  1944     ec_master_queue_datagram(master, &master->sync_mon_datagram);
       
  1945 }
       
  1946 
       
  1947 /*****************************************************************************/
       
  1948 
       
  1949 uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
       
  1950 {
       
  1951     if (master->sync_mon_datagram.state == EC_DATAGRAM_RECEIVED) {
       
  1952         return EC_READ_U32(master->sync_mon_datagram.data) & 0x7fffffff;
       
  1953     } else {
       
  1954         return 0xffffffff;
       
  1955     }
       
  1956 }
       
  1957 
       
  1958 /*****************************************************************************/
       
  1959 
  1927 /** \cond */
  1960 /** \cond */
  1928 
  1961 
  1929 EXPORT_SYMBOL(ecrt_master_create_domain);
  1962 EXPORT_SYMBOL(ecrt_master_create_domain);
  1930 EXPORT_SYMBOL(ecrt_master_activate);
  1963 EXPORT_SYMBOL(ecrt_master_activate);
  1931 EXPORT_SYMBOL(ecrt_master_deactivate);
  1964 EXPORT_SYMBOL(ecrt_master_deactivate);
  1936 EXPORT_SYMBOL(ecrt_master_slave_config);
  1969 EXPORT_SYMBOL(ecrt_master_slave_config);
  1937 EXPORT_SYMBOL(ecrt_master_state);
  1970 EXPORT_SYMBOL(ecrt_master_state);
  1938 EXPORT_SYMBOL(ecrt_master_application_time);
  1971 EXPORT_SYMBOL(ecrt_master_application_time);
  1939 EXPORT_SYMBOL(ecrt_master_sync_reference_clock);
  1972 EXPORT_SYMBOL(ecrt_master_sync_reference_clock);
  1940 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks);
  1973 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks);
       
  1974 EXPORT_SYMBOL(ecrt_master_sync_monitor_queue);
       
  1975 EXPORT_SYMBOL(ecrt_master_sync_monitor_process);
  1941 
  1976 
  1942 /** \endcond */
  1977 /** \endcond */
  1943 
  1978 
  1944 /*****************************************************************************/
  1979 /*****************************************************************************/