One, the IOCTL use instance
IOCTL usage examples
Driver. h file memdev.h
[CPP]View Plaincopy
- /* Define MAGIC number */
- #define Memdev_ioc_magic ' k '
- /* Define the command */
- #define Memdev_iocprint _io (memdev_ioc_magic, 1)
- #define Memdev_iocgetdata _ior (memdev_ioc_magic, 2, int)
- #define Memdev_iocsetdata _iow (memdev_ioc_magic, 3, int)
- #define MEMDEV_IOC_MAXNR 3
Driver. c File
[CPP]View Plaincopy
- /*io Operation */
- int Memdev_ioctl (struct inode *inode, struct file *filp,
- unsigned int cmd, unsigned long arg)
- {
- int err = 0;
- int ret = 0;
- int ioarg = 0;
- / * Check the validity of the command * /
- if (_ioc_type (cmd)! = memdev_ioc_magic)
- Return-einval;
- if (_ioc_nr (cmd) > Memdev_ioc_maxnr)
- Return-einval;
- / * Check whether the parameter space can be accessed according to the command type * /
- if (_ioc_dir (cmd) & _ioc_read)
- Err =!ACCESS_OK (Verify_write, (void *) arg, _ioc_size (cmd));
- Else if (_ioc_dir (cmd) & _ioc_write)
- Err =!ACCESS_OK (Verify_read, (void *) arg, _ioc_size (cmd));
- if (err)
- Return-efault;
- / * Perform the appropriate action according to the command * /
- switch (cmd) {
- / * Print current device information * /
- Case Memdev_iocprint:
- PRINTK ("<---CMD memdev_iocprint done--->\n\n");
- Break ;
- / * Get parameters * /
- Case Memdev_iocgetdata:
- Ioarg = 1101;
- ret = __put_user (Ioarg, (int *) arg);
- Break ;
- / * Set parameters * /
- Case Memdev_iocsetdata:
- ret = __get_user (Ioarg, (int *) arg);
- PRINTK ("<---in Kernel memdev_iocsetdata ioarg =%d--->\n\n", ioarg);
- Break ;
- Default:
- Return-einval;
- }
- return ret;
- }
Application
[CPP]View Plaincopy
- #include "Memdev.h"
- cmd = Memdev_iocprint;
- if (IOCTL (FD, CMD, &arg) < 0)
- {
- printf ("Call cmd memdev_iocprint fail\n");
- return-1;
- }
- cmd = Memdev_iocsetdata;
- arg = 2007;
- if (IOCTL (FD, CMD, &arg) < 0)
- {
- printf ("Call cmd memdev_iocsetdata fail\n");
- return-1;
- }
[Linux Driver] character device driver learning Note (iii) ——— advanced