master/cdev.c
changeset 1413 44c2b7c0ae1a
parent 1401 96baef8a3162
child 1415 9d1cdbf41247
equal deleted inserted replaced
1412:8f7bbbd3b7ac 1413:44c2b7c0ae1a
  1619     return 0;
  1619     return 0;
  1620 }
  1620 }
  1621 
  1621 
  1622 /*****************************************************************************/
  1622 /*****************************************************************************/
  1623 
  1623 
       
  1624 /** Sync the reference clock.
       
  1625  */
       
  1626 int ec_cdev_ioctl_sync_ref(
       
  1627         ec_master_t *master, /**< EtherCAT master. */
       
  1628         unsigned long arg, /**< ioctl() argument. */
       
  1629         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1630         )
       
  1631 {
       
  1632     ec_ioctl_dc_t data;
       
  1633     
       
  1634 	if (unlikely(!priv->requested))
       
  1635 		return -EPERM;
       
  1636 
       
  1637     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  1638         return -EFAULT;
       
  1639 
       
  1640     spin_lock_bh(&master->internal_lock);
       
  1641     ecrt_master_sync_reference_clock(master, &data.app_time);
       
  1642     spin_unlock_bh(&master->internal_lock);
       
  1643     return 0;
       
  1644 }
       
  1645 
       
  1646 /*****************************************************************************/
       
  1647 
       
  1648 /** Sync the slave clocks.
       
  1649  */
       
  1650 int ec_cdev_ioctl_sync_slaves(
       
  1651         ec_master_t *master, /**< EtherCAT master. */
       
  1652         unsigned long arg, /**< ioctl() argument. */
       
  1653         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1654         )
       
  1655 {
       
  1656 	if (unlikely(!priv->requested))
       
  1657 		return -EPERM;
       
  1658 
       
  1659     spin_lock_bh(&master->internal_lock);
       
  1660     ecrt_master_sync_slave_clocks(master);
       
  1661     spin_unlock_bh(&master->internal_lock);
       
  1662     return 0;
       
  1663 }
       
  1664 
       
  1665 /*****************************************************************************/
       
  1666 
  1624 /** Set the direction of a sync manager.
  1667 /** Set the direction of a sync manager.
  1625  */
  1668  */
  1626 int ec_cdev_ioctl_sc_sync(
  1669 int ec_cdev_ioctl_sc_sync(
  1627         ec_master_t *master, /**< EtherCAT master. */
  1670         ec_master_t *master, /**< EtherCAT master. */
  1628         unsigned long arg, /**< ioctl() argument. */
  1671         unsigned long arg, /**< ioctl() argument. */
  1842 
  1885 
  1843     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1886     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1844         return -EFAULT;
  1887         return -EFAULT;
  1845 
  1888 
  1846     return ret;
  1889     return ret;
       
  1890 }
       
  1891 
       
  1892 /*****************************************************************************/
       
  1893 
       
  1894 /** Sets the DC AssignActivate word.
       
  1895  */
       
  1896 int ec_cdev_ioctl_sc_dc_assign(
       
  1897         ec_master_t *master, /**< EtherCAT master. */
       
  1898         unsigned long arg, /**< ioctl() argument. */
       
  1899         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1900         )
       
  1901 {
       
  1902     ec_ioctl_sc_dc_t data;
       
  1903     ec_slave_config_t *sc;
       
  1904 
       
  1905 	if (unlikely(!priv->requested))
       
  1906         return -EPERM;
       
  1907 
       
  1908     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  1909         return -EFAULT;
       
  1910 
       
  1911     if (down_interruptible(&master->master_sem))
       
  1912         return -EINTR;
       
  1913 
       
  1914     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  1915         up(&master->master_sem);
       
  1916         return -ENOENT;
       
  1917     }
       
  1918 
       
  1919     ecrt_slave_config_dc_assign_activate(sc, data.assign_activate);
       
  1920 
       
  1921     up(&master->master_sem);
       
  1922 
       
  1923     return 0;
       
  1924 }
       
  1925 
       
  1926 /*****************************************************************************/
       
  1927 
       
  1928 /** Sets the DC cycle times.
       
  1929  */
       
  1930 int ec_cdev_ioctl_sc_dc_cycle(
       
  1931         ec_master_t *master, /**< EtherCAT master. */
       
  1932         unsigned long arg, /**< ioctl() argument. */
       
  1933         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1934         )
       
  1935 {
       
  1936     ec_ioctl_sc_dc_t data;
       
  1937     ec_slave_config_t *sc;
       
  1938 
       
  1939 	if (unlikely(!priv->requested))
       
  1940         return -EPERM;
       
  1941 
       
  1942     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  1943         return -EFAULT;
       
  1944 
       
  1945     if (down_interruptible(&master->master_sem))
       
  1946         return -EINTR;
       
  1947 
       
  1948     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  1949         up(&master->master_sem);
       
  1950         return -ENOENT;
       
  1951     }
       
  1952 
       
  1953     ecrt_slave_config_dc_sync_cycle_times(sc, data.cycle[0], data.cycle[1]);
       
  1954 
       
  1955     up(&master->master_sem);
       
  1956 
       
  1957     return 0;
       
  1958 }
       
  1959 
       
  1960 /*****************************************************************************/
       
  1961 
       
  1962 /** Sets the DC shift times.
       
  1963  */
       
  1964 int ec_cdev_ioctl_sc_dc_shift(
       
  1965         ec_master_t *master, /**< EtherCAT master. */
       
  1966         unsigned long arg, /**< ioctl() argument. */
       
  1967         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1968         )
       
  1969 {
       
  1970     ec_ioctl_sc_dc_t data;
       
  1971     ec_slave_config_t *sc;
       
  1972 
       
  1973 	if (unlikely(!priv->requested))
       
  1974         return -EPERM;
       
  1975 
       
  1976     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  1977         return -EFAULT;
       
  1978 
       
  1979     if (down_interruptible(&master->master_sem))
       
  1980         return -EINTR;
       
  1981 
       
  1982     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  1983         up(&master->master_sem);
       
  1984         return -ENOENT;
       
  1985     }
       
  1986 
       
  1987     ecrt_slave_config_dc_sync_shift_times(sc, data.shift[0], data.shift[1]);
       
  1988 
       
  1989     up(&master->master_sem);
       
  1990 
       
  1991     return 0;
  1847 }
  1992 }
  1848 
  1993 
  1849 /*****************************************************************************/
  1994 /*****************************************************************************/
  1850 
  1995 
  1851 /** Configures an SDO.
  1996 /** Configures an SDO.
  3033             if (!(filp->f_mode & FMODE_WRITE))
  3178             if (!(filp->f_mode & FMODE_WRITE))
  3034 				return -EPERM;
  3179 				return -EPERM;
  3035 			return ec_cdev_ioctl_receive(master, arg, priv);
  3180 			return ec_cdev_ioctl_receive(master, arg, priv);
  3036         case EC_IOCTL_MASTER_STATE:
  3181         case EC_IOCTL_MASTER_STATE:
  3037 			return ec_cdev_ioctl_master_state(master, arg, priv);
  3182 			return ec_cdev_ioctl_master_state(master, arg, priv);
       
  3183         case EC_IOCTL_SYNC_REF:
       
  3184             if (!(filp->f_mode & FMODE_WRITE))
       
  3185 				return -EPERM;
       
  3186 			return ec_cdev_ioctl_sync_ref(master, arg, priv);
       
  3187         case EC_IOCTL_SYNC_SLAVES:
       
  3188             if (!(filp->f_mode & FMODE_WRITE))
       
  3189 				return -EPERM;
       
  3190 			return ec_cdev_ioctl_sync_slaves(master, arg, priv);
  3038         case EC_IOCTL_SC_SYNC:
  3191         case EC_IOCTL_SC_SYNC:
  3039             if (!(filp->f_mode & FMODE_WRITE))
  3192             if (!(filp->f_mode & FMODE_WRITE))
  3040 				return -EPERM;
  3193 				return -EPERM;
  3041 			return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3194 			return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3042         case EC_IOCTL_SC_ADD_PDO:
  3195         case EC_IOCTL_SC_ADD_PDO:
  3057 			return ec_cdev_ioctl_sc_clear_entries(master, arg, priv);
  3210 			return ec_cdev_ioctl_sc_clear_entries(master, arg, priv);
  3058         case EC_IOCTL_SC_REG_PDO_ENTRY:
  3211         case EC_IOCTL_SC_REG_PDO_ENTRY:
  3059             if (!(filp->f_mode & FMODE_WRITE))
  3212             if (!(filp->f_mode & FMODE_WRITE))
  3060 				return -EPERM;
  3213 				return -EPERM;
  3061 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  3214 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
       
  3215         case EC_IOCTL_SC_DC_ASSIGN:
       
  3216             if (!(filp->f_mode & FMODE_WRITE))
       
  3217 				return -EPERM;
       
  3218 			return ec_cdev_ioctl_sc_dc_assign(master, arg, priv);
       
  3219         case EC_IOCTL_SC_DC_CYCLE:
       
  3220             if (!(filp->f_mode & FMODE_WRITE))
       
  3221 				return -EPERM;
       
  3222 			return ec_cdev_ioctl_sc_dc_cycle(master, arg, priv);
       
  3223         case EC_IOCTL_SC_DC_SHIFT:
       
  3224             if (!(filp->f_mode & FMODE_WRITE))
       
  3225 				return -EPERM;
       
  3226 			return ec_cdev_ioctl_sc_dc_shift(master, arg, priv);
  3062         case EC_IOCTL_SC_SDO:
  3227         case EC_IOCTL_SC_SDO:
  3063             if (!(filp->f_mode & FMODE_WRITE))
  3228             if (!(filp->f_mode & FMODE_WRITE))
  3064 				return -EPERM;
  3229 				return -EPERM;
  3065 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
  3230 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
  3066         case EC_IOCTL_SC_SDO_REQUEST:
  3231         case EC_IOCTL_SC_SDO_REQUEST: