master/cdev.c
changeset 1580 1baac79a40cf
parent 1535 0c484ee12d89
child 1544 cfcaf46c5b3f
child 1582 7273aa7deb3d
equal deleted inserted replaced
1579:326d47aa986c 1580:1baac79a40cf
   169     if (down_interruptible(&master->master_sem))
   169     if (down_interruptible(&master->master_sem))
   170         return -EINTR;
   170         return -EINTR;
   171     data.slave_count = master->slave_count;
   171     data.slave_count = master->slave_count;
   172     data.config_count = ec_master_config_count(master);
   172     data.config_count = ec_master_config_count(master);
   173     data.domain_count = ec_master_domain_count(master);
   173     data.domain_count = ec_master_domain_count(master);
       
   174 #ifdef EC_EOE
   174     data.eoe_handler_count = ec_master_eoe_handler_count(master);
   175     data.eoe_handler_count = ec_master_eoe_handler_count(master);
       
   176 #endif
   175     data.phase = (uint8_t) master->phase;
   177     data.phase = (uint8_t) master->phase;
       
   178     data.active = (uint8_t) master->active;
   176     data.scan_busy = master->scan_busy;
   179     data.scan_busy = master->scan_busy;
   177     up(&master->master_sem);
   180     up(&master->master_sem);
   178 
   181 
   179     if (down_interruptible(&master->device_sem))
   182     if (down_interruptible(&master->device_sem))
   180         return -EINTR;
   183         return -EINTR;
  1254     data.position = sc->position;
  1257     data.position = sc->position;
  1255     data.vendor_id = sc->vendor_id;
  1258     data.vendor_id = sc->vendor_id;
  1256     data.product_code = sc->product_code;
  1259     data.product_code = sc->product_code;
  1257     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) {
  1260     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) {
  1258         data.syncs[i].dir = sc->sync_configs[i].dir;
  1261         data.syncs[i].dir = sc->sync_configs[i].dir;
       
  1262         data.syncs[i].watchdog_mode = sc->sync_configs[i].watchdog_mode;
  1259         data.syncs[i].pdo_count =
  1263         data.syncs[i].pdo_count =
  1260             ec_pdo_list_count(&sc->sync_configs[i].pdos);
  1264             ec_pdo_list_count(&sc->sync_configs[i].pdos);
  1261     }
  1265     }
       
  1266     data.watchdog_divider = sc->watchdog_divider;
       
  1267     data.watchdog_intervals = sc->watchdog_intervals;
  1262     data.sdo_count = ec_slave_config_sdo_count(sc);
  1268     data.sdo_count = ec_slave_config_sdo_count(sc);
  1263     data.slave_position = sc->slave ? sc->slave->ring_position : -1;
  1269     data.slave_position = sc->slave ? sc->slave->ring_position : -1;
  1264     data.dc_assign_activate = sc->dc_assign_activate;
  1270     data.dc_assign_activate = sc->dc_assign_activate;
  1265     for (i = 0; i < EC_SYNC_SIGNAL_COUNT; i++) {
  1271     for (i = 0; i < EC_SYNC_SIGNAL_COUNT; i++) {
  1266         data.dc_sync[i] = sc->dc_sync[i];
  1272         data.dc_sync[i] = sc->dc_sync[i];
  1427     }
  1433     }
  1428 
  1434 
  1429     data.index = req->index;
  1435     data.index = req->index;
  1430     data.subindex = req->subindex;
  1436     data.subindex = req->subindex;
  1431     data.size = req->data_size;
  1437     data.size = req->data_size;
  1432     memcpy(&data.data, req->data, min((u32) data.size, (u32) 4));
  1438     memcpy(&data.data, req->data,
       
  1439             min((u32) data.size, (u32) EC_MAX_SDO_DATA_SIZE));
  1433 
  1440 
  1434     up(&master->master_sem);
  1441     up(&master->master_sem);
  1435 
  1442 
  1436     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1443     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1437         return -EFAULT;
  1444         return -EFAULT;
  1438 
  1445 
  1439     return 0;
  1446     return 0;
  1440 }
  1447 }
  1441 
  1448 
  1442 /*****************************************************************************/
  1449 /*****************************************************************************/
       
  1450 
       
  1451 #ifdef EC_EOE
  1443 
  1452 
  1444 /** Get EoE handler information.
  1453 /** Get EoE handler information.
  1445  */
  1454  */
  1446 int ec_cdev_ioctl_eoe_handler(
  1455 int ec_cdev_ioctl_eoe_handler(
  1447         ec_master_t *master, /**< EtherCAT master. */
  1456         ec_master_t *master, /**< EtherCAT master. */
  1484         return -EFAULT;
  1493         return -EFAULT;
  1485 
  1494 
  1486     return 0;
  1495     return 0;
  1487 }
  1496 }
  1488 
  1497 
       
  1498 #endif
       
  1499 
  1489 /*****************************************************************************/
  1500 /*****************************************************************************/
  1490 
  1501 
  1491 /** Request the master from userspace.
  1502 /** Request the master from userspace.
  1492  */
  1503  */
  1493 int ec_cdev_ioctl_request(
  1504 int ec_cdev_ioctl_request(
  1620             offset += ecrt_domain_size(domain);
  1631             offset += ecrt_domain_size(domain);
  1621         }
  1632         }
  1622     }
  1633     }
  1623 
  1634 
  1624     ecrt_master_callbacks(master, ec_master_internal_send_cb,
  1635     ecrt_master_callbacks(master, ec_master_internal_send_cb,
  1625             ec_master_internal_receive_cb);
  1636             ec_master_internal_receive_cb, master);
  1626 
  1637 
  1627     ret = ecrt_master_activate(master);
  1638     ret = ecrt_master_activate(master);
  1628     if (ret < 0)
  1639     if (ret < 0)
  1629         return ret;
  1640         return ret;
  1630 
  1641 
  1635     return 0;
  1646     return 0;
  1636 }
  1647 }
  1637 
  1648 
  1638 /*****************************************************************************/
  1649 /*****************************************************************************/
  1639 
  1650 
       
  1651 /** Deactivates the master.
       
  1652  */
       
  1653 int ec_cdev_ioctl_deactivate(
       
  1654         ec_master_t *master, /**< EtherCAT master. */
       
  1655         unsigned long arg, /**< ioctl() argument. */
       
  1656         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1657         )
       
  1658 {
       
  1659     if (unlikely(!priv->requested))
       
  1660         return -EPERM;
       
  1661 
       
  1662     ecrt_master_deactivate(master);
       
  1663     return 0;
       
  1664 }
       
  1665 
       
  1666 /*****************************************************************************/
       
  1667 
  1640 /** Send frames.
  1668 /** Send frames.
  1641  */
  1669  */
  1642 int ec_cdev_ioctl_send(
  1670 int ec_cdev_ioctl_send(
  1643         ec_master_t *master, /**< EtherCAT master. */
  1671         ec_master_t *master, /**< EtherCAT master. */
  1644         unsigned long arg, /**< ioctl() argument. */
  1672         unsigned long arg, /**< ioctl() argument. */
  1752         return -EPERM;
  1780         return -EPERM;
  1753 
  1781 
  1754     down(&master->io_sem);
  1782     down(&master->io_sem);
  1755     ecrt_master_sync_slave_clocks(master);
  1783     ecrt_master_sync_slave_clocks(master);
  1756     up(&master->io_sem);
  1784     up(&master->io_sem);
       
  1785     return 0;
       
  1786 }
       
  1787 
       
  1788 /*****************************************************************************/
       
  1789 
       
  1790 /** Queue the sync monitoring datagram.
       
  1791  */
       
  1792 int ec_cdev_ioctl_sync_mon_queue(
       
  1793         ec_master_t *master, /**< EtherCAT master. */
       
  1794         unsigned long arg, /**< ioctl() argument. */
       
  1795         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1796         )
       
  1797 {
       
  1798     if (unlikely(!priv->requested))
       
  1799         return -EPERM;
       
  1800 
       
  1801     down(&master->io_sem);
       
  1802     ecrt_master_sync_monitor_queue(master);
       
  1803     up(&master->io_sem);
       
  1804     return 0;
       
  1805 }
       
  1806 
       
  1807 /*****************************************************************************/
       
  1808 
       
  1809 /** Processes the sync monitoring datagram.
       
  1810  */
       
  1811 int ec_cdev_ioctl_sync_mon_process(
       
  1812         ec_master_t *master, /**< EtherCAT master. */
       
  1813         unsigned long arg, /**< ioctl() argument. */
       
  1814         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1815         )
       
  1816 {
       
  1817     uint32_t time_diff;
       
  1818 
       
  1819     if (unlikely(!priv->requested))
       
  1820         return -EPERM;
       
  1821 
       
  1822     down(&master->io_sem);
       
  1823     time_diff = ecrt_master_sync_monitor_process(master);
       
  1824     up(&master->io_sem);
       
  1825 
       
  1826     if (copy_to_user((void __user *) arg, &time_diff, sizeof(time_diff)))
       
  1827         return -EFAULT;
       
  1828 
  1757     return 0;
  1829     return 0;
  1758 }
  1830 }
  1759 
  1831 
  1760 /*****************************************************************************/
  1832 /*****************************************************************************/
  1761 
  1833 
  2109         return -ENOENT;
  2181         return -ENOENT;
  2110     }
  2182     }
  2111 
  2183 
  2112     up(&master->master_sem); // FIXME
  2184     up(&master->master_sem); // FIXME
  2113 
  2185 
  2114     ret = ecrt_slave_config_sdo(sc, data.index, data.subindex, sdo_data,
  2186     if (data.complete_access) {
  2115             data.size);
  2187         ret = ecrt_slave_config_complete_sdo(sc, data.index, sdo_data, data.size);
       
  2188     } else {
       
  2189         ret = ecrt_slave_config_sdo(sc, data.index, data.subindex, sdo_data,
       
  2190                 data.size);
       
  2191     }
  2116     kfree(sdo_data);
  2192     kfree(sdo_data);
  2117     return ret;
  2193     return ret;
  2118 }
  2194 }
  2119 
  2195 
  2120 /*****************************************************************************/
  2196 /*****************************************************************************/
  3226             return ec_cdev_ioctl_config_pdo(master, arg);
  3302             return ec_cdev_ioctl_config_pdo(master, arg);
  3227         case EC_IOCTL_CONFIG_PDO_ENTRY:
  3303         case EC_IOCTL_CONFIG_PDO_ENTRY:
  3228             return ec_cdev_ioctl_config_pdo_entry(master, arg);
  3304             return ec_cdev_ioctl_config_pdo_entry(master, arg);
  3229         case EC_IOCTL_CONFIG_SDO:
  3305         case EC_IOCTL_CONFIG_SDO:
  3230             return ec_cdev_ioctl_config_sdo(master, arg);
  3306             return ec_cdev_ioctl_config_sdo(master, arg);
       
  3307 #ifdef EC_EOE
  3231         case EC_IOCTL_EOE_HANDLER:
  3308         case EC_IOCTL_EOE_HANDLER:
  3232             return ec_cdev_ioctl_eoe_handler(master, arg);
  3309             return ec_cdev_ioctl_eoe_handler(master, arg);
       
  3310 #endif
  3233         case EC_IOCTL_REQUEST:
  3311         case EC_IOCTL_REQUEST:
  3234             if (!(filp->f_mode & FMODE_WRITE))
  3312             if (!(filp->f_mode & FMODE_WRITE))
  3235                 return -EPERM;
  3313                 return -EPERM;
  3236             return ec_cdev_ioctl_request(master, arg, priv);
  3314             return ec_cdev_ioctl_request(master, arg, priv);
  3237         case EC_IOCTL_CREATE_DOMAIN:
  3315         case EC_IOCTL_CREATE_DOMAIN:
  3244             return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  3322             return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  3245         case EC_IOCTL_ACTIVATE:
  3323         case EC_IOCTL_ACTIVATE:
  3246             if (!(filp->f_mode & FMODE_WRITE))
  3324             if (!(filp->f_mode & FMODE_WRITE))
  3247                 return -EPERM;
  3325                 return -EPERM;
  3248             return ec_cdev_ioctl_activate(master, arg, priv);
  3326             return ec_cdev_ioctl_activate(master, arg, priv);
       
  3327         case EC_IOCTL_DEACTIVATE:
       
  3328             if (!(filp->f_mode & FMODE_WRITE))
       
  3329                 return -EPERM;
       
  3330             return ec_cdev_ioctl_deactivate(master, arg, priv);
  3249         case EC_IOCTL_SEND:
  3331         case EC_IOCTL_SEND:
  3250             if (!(filp->f_mode & FMODE_WRITE))
  3332             if (!(filp->f_mode & FMODE_WRITE))
  3251                 return -EPERM;
  3333                 return -EPERM;
  3252             return ec_cdev_ioctl_send(master, arg, priv);
  3334             return ec_cdev_ioctl_send(master, arg, priv);
  3253         case EC_IOCTL_RECEIVE:
  3335         case EC_IOCTL_RECEIVE:
  3266             return ec_cdev_ioctl_sync_ref(master, arg, priv);
  3348             return ec_cdev_ioctl_sync_ref(master, arg, priv);
  3267         case EC_IOCTL_SYNC_SLAVES:
  3349         case EC_IOCTL_SYNC_SLAVES:
  3268             if (!(filp->f_mode & FMODE_WRITE))
  3350             if (!(filp->f_mode & FMODE_WRITE))
  3269                 return -EPERM;
  3351                 return -EPERM;
  3270             return ec_cdev_ioctl_sync_slaves(master, arg, priv);
  3352             return ec_cdev_ioctl_sync_slaves(master, arg, priv);
       
  3353         case EC_IOCTL_SYNC_MON_QUEUE:
       
  3354             if (!(filp->f_mode & FMODE_WRITE))
       
  3355                 return -EPERM;
       
  3356             return ec_cdev_ioctl_sync_mon_queue(master, arg, priv);
       
  3357         case EC_IOCTL_SYNC_MON_PROCESS:
       
  3358             if (!(filp->f_mode & FMODE_WRITE))
       
  3359                 return -EPERM;
       
  3360             return ec_cdev_ioctl_sync_mon_process(master, arg, priv);
  3271         case EC_IOCTL_SC_SYNC:
  3361         case EC_IOCTL_SC_SYNC:
  3272             if (!(filp->f_mode & FMODE_WRITE))
  3362             if (!(filp->f_mode & FMODE_WRITE))
  3273                 return -EPERM;
  3363                 return -EPERM;
  3274             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3364             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3275         case EC_IOCTL_SC_WATCHDOG:
  3365         case EC_IOCTL_SC_WATCHDOG: