master/cdev.c
changeset 1242 632a6b91f8e4
parent 1223 6d539205114e
child 1244 0b70040d3daa
equal deleted inserted replaced
1241:794cbccdcd00 1242:632a6b91f8e4
    64 
    64 
    65 /** \endcond */
    65 /** \endcond */
    66 
    66 
    67 /*****************************************************************************/
    67 /*****************************************************************************/
    68 
    68 
       
    69 /** Private data structure for file handles.
       
    70  */
       
    71 typedef struct {
       
    72     ec_cdev_t *cdev;
       
    73     unsigned int requested;
       
    74 } ec_cdev_priv_t;
       
    75 
       
    76 /*****************************************************************************/
       
    77 
    69 /** Constructor.
    78 /** Constructor.
    70  * 
    79  * 
    71  * \return 0 in case of success, else < 0
    80  * \return 0 in case of success, else < 0
    72  */
    81  */
    73 int ec_cdev_init(
    82 int ec_cdev_init(
  1352         return -EFAULT;
  1361         return -EFAULT;
  1353 
  1362 
  1354     return 0;
  1363     return 0;
  1355 }
  1364 }
  1356 
  1365 
       
  1366 /*****************************************************************************/
       
  1367 
       
  1368 /** Request the master from userspace.
       
  1369  */
       
  1370 int ec_cdev_ioctl_request(
       
  1371         ec_master_t *master, /**< EtherCAT master. */
       
  1372         unsigned long arg, /**< ioctl() argument. */
       
  1373         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1374         )
       
  1375 {
       
  1376     ec_ioctl_request_t data;
       
  1377     int ret = 0;
       
  1378 
       
  1379     data.handle = ecrt_request_master(master->index);
       
  1380 
       
  1381     if (IS_ERR(data.handle)) {
       
  1382         ret = PTR_ERR(data.handle);
       
  1383     } else {
       
  1384         priv->requested = 1;
       
  1385         if (copy_to_user((void __user *) arg, &data, sizeof(data)))
       
  1386             ret = -EFAULT;
       
  1387     }
       
  1388 
       
  1389     return ret;
       
  1390 }
       
  1391 
  1357 /******************************************************************************
  1392 /******************************************************************************
  1358  * File operations
  1393  * File operations
  1359  *****************************************************************************/
  1394  *****************************************************************************/
  1360 
  1395 
  1361 /** Called when the cdev is opened.
  1396 /** Called when the cdev is opened.
  1362  */
  1397  */
  1363 int eccdev_open(struct inode *inode, struct file *filp)
  1398 int eccdev_open(struct inode *inode, struct file *filp)
  1364 {
  1399 {
  1365     ec_cdev_t *cdev = container_of(inode->i_cdev, ec_cdev_t, cdev);
  1400     ec_cdev_t *cdev = container_of(inode->i_cdev, ec_cdev_t, cdev);
  1366     ec_master_t *master = cdev->master;
  1401     ec_master_t *master = cdev->master;
  1367 
  1402     ec_cdev_priv_t *priv;
  1368     filp->private_data = cdev;
  1403 
       
  1404     priv = kmalloc(sizeof(ec_cdev_priv_t), GFP_KERNEL);
       
  1405     if (!priv) {
       
  1406         EC_ERR("Failed to allocate memory for private data structure.\n");
       
  1407         return -ENOMEM;
       
  1408     }
       
  1409 
       
  1410     priv->cdev = cdev;
       
  1411     priv->requested = 0;
       
  1412 
       
  1413     filp->private_data = priv;
  1369     if (master->debug_level)
  1414     if (master->debug_level)
  1370         EC_DBG("File opened.\n");
  1415         EC_DBG("File opened.\n");
  1371     return 0;
  1416     return 0;
  1372 }
  1417 }
  1373 
  1418 
  1375 
  1420 
  1376 /** Called when the cdev is closed.
  1421 /** Called when the cdev is closed.
  1377  */
  1422  */
  1378 int eccdev_release(struct inode *inode, struct file *filp)
  1423 int eccdev_release(struct inode *inode, struct file *filp)
  1379 {
  1424 {
  1380     ec_cdev_t *cdev = (ec_cdev_t *) filp->private_data;
  1425     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  1381     ec_master_t *master = cdev->master;
  1426     ec_master_t *master = priv->cdev->master;
       
  1427 
       
  1428     if (priv->requested)
       
  1429         ecrt_release_master(master);
  1382 
  1430 
  1383     if (master->debug_level)
  1431     if (master->debug_level)
  1384         EC_DBG("File closed.\n");
  1432         EC_DBG("File closed.\n");
       
  1433     kfree(priv);
  1385     return 0;
  1434     return 0;
  1386 }
  1435 }
  1387 
  1436 
  1388 /*****************************************************************************/
  1437 /*****************************************************************************/
  1389 
  1438 
  1390 /** Called when an ioctl() command is issued.
  1439 /** Called when an ioctl() command is issued.
  1391  */
  1440  */
  1392 long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  1441 long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  1393 {
  1442 {
  1394     ec_cdev_t *cdev = (ec_cdev_t *) filp->private_data;
  1443     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  1395     ec_master_t *master = cdev->master;
  1444     ec_master_t *master = priv->cdev->master;
  1396 
  1445 
  1397     if (master->debug_level)
  1446     if (master->debug_level)
  1398         EC_DBG("ioctl(filp = %x, cmd = %u (%u), arg = %x)\n",
  1447         EC_DBG("ioctl(filp = %x, cmd = %u (%u), arg = %x)\n",
  1399                 (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg);
  1448                 (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg);
  1400 
  1449 
  1451             return ec_cdev_ioctl_config_pdo(master, arg);
  1500             return ec_cdev_ioctl_config_pdo(master, arg);
  1452         case EC_IOCTL_CONFIG_PDO_ENTRY:
  1501         case EC_IOCTL_CONFIG_PDO_ENTRY:
  1453             return ec_cdev_ioctl_config_pdo_entry(master, arg);
  1502             return ec_cdev_ioctl_config_pdo_entry(master, arg);
  1454         case EC_IOCTL_CONFIG_SDO:
  1503         case EC_IOCTL_CONFIG_SDO:
  1455             return ec_cdev_ioctl_config_sdo(master, arg);
  1504             return ec_cdev_ioctl_config_sdo(master, arg);
       
  1505         case EC_IOCTL_REQUEST:
       
  1506             if (!(filp->f_mode & FMODE_WRITE))
       
  1507 				return -EPERM;
       
  1508 			return ec_cdev_ioctl_request(master, arg, priv);
  1456         default:
  1509         default:
  1457             return -ENOTTY;
  1510             return -ENOTTY;
  1458     }
  1511     }
  1459 }
  1512 }
  1460 
  1513