1. 程式人生 > 其它 >六、【ioctl】應用程式和驅動程式中的ioctl

六、【ioctl】應用程式和驅動程式中的ioctl

1、介面函式介紹

很多裝置除了讀和寫之外,還需要驅動提供其它操作能力,例如:獲取LCD尺寸、修改串列埠波特率

(應用層)函式原型:

#include <sys/ioctl.h>
 int ioctl(int fd, unsigned long request, ...);

(driver)提供介面函式

struct file_operations {
	.....
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
	long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
	......
	}
	

2.6.36之後的核心版本只支援unlocked_ioctl,之前的一些過渡版本兩者都支援,更早的版本只支援compat_ioctl

long (*unlocked_ioctl) (struct file * filp, unsigned int cmd , unsigned long arg); 

引數:

  • filp:指向開啟的檔案資訊結構體。
  • cmd:驅動提供給應用程式的命令字。
  • arg:應用程式與驅動之間傳遞的引數。

2、命令字的組成

(1)bit解釋

  • bit[31:30]:引數傳遞的方向。應用--->驅動、驅動--->應用、應用<--->驅動、不需要引數.
  • bit[29:16]:引數的大小,用資料型別表示大小char int struct xxx。
  • bit[15:8]:魔數/幻數,用於區分不同驅動的命令字,一般設定為某個字元的ASCII碼。
  • bit[7:0]:命令字的序號。

(2)核心中提供的生成命令字的巨集

#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))

_IO---生成沒有引數傳遞的命令字。 _IOR--生成應用從驅動獲取引數的命令字。 _IOW--生成應用給驅動傳遞引數的命令字。 _IOWR--生成雙向傳參的命令字。 

引數:

  • type:魔數/幻數,用於區分不同驅動的命令字,一般設定為某個字元的ASCII碼
  • nr:命令字的序號
  • size:引數的大小,用資料型別表示大小char int struct xxx

例如: 

#define BEEP_ON _IO('B',0)
#define BEEP_OFF _IO('B',1)

#define LED_ON _IOW('L',0,unsigned int)
#define LED_OFF _IOW('L',1,unsigned int)