examples/rtai/rtai_sample.c
changeset 1500 ed1a733efbc5
parent 1363 11c0b2caa253
child 1508 60a116ed3897
equal deleted inserted replaced
1499:5461fce4a2ea 1500:ed1a733efbc5
    57 /*****************************************************************************/
    57 /*****************************************************************************/
    58 
    58 
    59 // EtherCAT
    59 // EtherCAT
    60 static ec_master_t *master = NULL;
    60 static ec_master_t *master = NULL;
    61 static ec_master_state_t master_state = {};
    61 static ec_master_state_t master_state = {};
    62 spinlock_t master_lock = SPIN_LOCK_UNLOCKED;
       
    63 
    62 
    64 static ec_domain_t *domain1 = NULL;
    63 static ec_domain_t *domain1 = NULL;
    65 static ec_domain_state_t domain1_state = {};
    64 static ec_domain_state_t domain1_state = {};
    66 
    65 
    67 static ec_slave_config_t *sc_ana_in = NULL;
    66 static ec_slave_config_t *sc_ana_in = NULL;
   144 
   143 
   145 void check_domain1_state(void)
   144 void check_domain1_state(void)
   146 {
   145 {
   147     ec_domain_state_t ds;
   146     ec_domain_state_t ds;
   148 
   147 
   149     spin_lock(&master_lock);
   148     rt_sem_wait(&master_sem);
   150     ecrt_domain_state(domain1, &ds);
   149     ecrt_domain_state(domain1, &ds);
   151     spin_unlock(&master_lock);
   150     rt_sem_signal(&master_sem);
   152 
   151 
   153     if (ds.working_counter != domain1_state.working_counter)
   152     if (ds.working_counter != domain1_state.working_counter)
   154         printk(KERN_INFO PFX "Domain1: WC %u.\n", ds.working_counter);
   153         printk(KERN_INFO PFX "Domain1: WC %u.\n", ds.working_counter);
   155     if (ds.wc_state != domain1_state.wc_state)
   154     if (ds.wc_state != domain1_state.wc_state)
   156         printk(KERN_INFO PFX "Domain1: State %u.\n", ds.wc_state);
   155         printk(KERN_INFO PFX "Domain1: State %u.\n", ds.wc_state);
   162 
   161 
   163 void check_master_state(void)
   162 void check_master_state(void)
   164 {
   163 {
   165     ec_master_state_t ms;
   164     ec_master_state_t ms;
   166 
   165 
   167     spin_lock(&master_lock);
   166     rt_sem_wait(&master_sem);
   168     ecrt_master_state(master, &ms);
   167     ecrt_master_state(master, &ms);
   169     spin_unlock(&master_lock);
   168     rt_sem_signal(&master_sem);
   170 
   169 
   171     if (ms.slaves_responding != master_state.slaves_responding)
   170     if (ms.slaves_responding != master_state.slaves_responding)
   172         printk(KERN_INFO PFX "%u slave(s).\n", ms.slaves_responding);
   171         printk(KERN_INFO PFX "%u slave(s).\n", ms.slaves_responding);
   173     if (ms.al_states != master_state.al_states)
   172     if (ms.al_states != master_state.al_states)
   174         printk(KERN_INFO PFX "AL states: 0x%02X.\n", ms.al_states);
   173         printk(KERN_INFO PFX "AL states: 0x%02X.\n", ms.al_states);
   182 
   181 
   183 void check_slave_config_states(void)
   182 void check_slave_config_states(void)
   184 {
   183 {
   185     ec_slave_config_state_t s;
   184     ec_slave_config_state_t s;
   186 
   185 
   187     spin_lock(&master_lock);
   186     rt_sem_wait(&master_sem);
   188     ecrt_slave_config_state(sc_ana_in, &s);
   187     ecrt_slave_config_state(sc_ana_in, &s);
   189     spin_unlock(&master_lock);
   188     rt_sem_signal(&master_sem);
   190 
   189 
   191     if (s.al_state != sc_ana_in_state.al_state)
   190     if (s.al_state != sc_ana_in_state.al_state)
   192         printk(KERN_INFO PFX "AnaIn: State 0x%02X.\n", s.al_state);
   191         printk(KERN_INFO PFX "AnaIn: State 0x%02X.\n", s.al_state);
   193     if (s.online != sc_ana_in_state.online)
   192     if (s.online != sc_ana_in_state.online)
   194         printk(KERN_INFO PFX "AnaIn: %s.\n", s.online ? "online" : "offline");
   193         printk(KERN_INFO PFX "AnaIn: %s.\n", s.online ? "online" : "offline");
   242     }
   241     }
   243 }
   242 }
   244 
   243 
   245 /*****************************************************************************/
   244 /*****************************************************************************/
   246 
   245 
   247 int request_lock(void *data)
   246 void send_callback(ec_master_t *master)
   248 {
   247 {
   249     // too close to the next real time cycle: deny access...
   248     // too close to the next real time cycle: deny access...
   250     if (get_cycles() - t_last_cycle > t_critical) return -1;
   249     if (get_cycles() - t_last_cycle <= t_critical) {
   251 
   250         rt_sem_wait(&master_sem);
   252     // allow access
   251         ecrt_master_send_ext(master);
   253     rt_sem_wait(&master_sem);
   252         rt_sem_signal(&master_sem);
   254     return 0;
   253     }
   255 }
   254 }
   256 
   255 
   257 /*****************************************************************************/
   256 /*****************************************************************************/
   258 
   257 
   259 void release_lock(void *data)
   258 void receive_callback(ec_master_t *master)
   260 {
   259 {
   261     rt_sem_signal(&master_sem);
   260     // too close to the next real time cycle: deny access...
       
   261     if (get_cycles() - t_last_cycle <= t_critical) {
       
   262         rt_sem_wait(&master_sem);
       
   263         ecrt_master_receive(master);
       
   264         rt_sem_signal(&master_sem);
       
   265     }
   262 }
   266 }
   263 
   267 
   264 /*****************************************************************************/
   268 /*****************************************************************************/
   265 
   269 
   266 int __init init_mod(void)
   270 int __init init_mod(void)
   275 
   279 
   276     rt_sem_init(&master_sem, 1);
   280     rt_sem_init(&master_sem, 1);
   277 
   281 
   278     t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000;
   282     t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000;
   279 
   283 
   280 
       
   281     master = ecrt_request_master(0);
   284     master = ecrt_request_master(0);
   282     if (IS_ERR(master)) {
   285     if (IS_ERR(master)) {
   283         ret = PTR_ERR(master); 
   286         ret = PTR_ERR(master); 
   284         printk(KERN_ERR PFX "Requesting master 0 failed!\n");
   287         printk(KERN_ERR PFX "Requesting master 0 failed!\n");
   285         goto out_return;
   288         goto out_return;
   286     }
   289     }
   287 
   290 
   288     ecrt_master_callbacks(master, request_lock, release_lock, NULL);
   291     ecrt_master_callbacks(master, send_callback, receive_callback);
   289 
   292 
   290     printk(KERN_INFO PFX "Registering domain...\n");
   293     printk(KERN_INFO PFX "Registering domain...\n");
   291     if (!(domain1 = ecrt_master_create_domain(master))) {
   294     if (!(domain1 = ecrt_master_create_domain(master))) {
   292         printk(KERN_ERR PFX "Domain creation failed!\n");
   295         printk(KERN_ERR PFX "Domain creation failed!\n");
   293         goto out_release_master;
   296         goto out_release_master;