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: |