linux如何通過ioctl呼叫驅動的

2021-08-29 09:45:33 字數 1761 閱讀 8678

ioctl作用:應用層的ioctl函式傳入的cmd和arg引數會直接傳入驅動層的ioctl介面,在對應驅動檔案裡會對相應的命令進行操作

對於傳遞的ioctl命令有一定的規範,具體可以參考:/include/asm/ioctl.h,/documentation/ioctl-number.txt 這兩個檔案

應用層和驅動程式聯絡如下:

最終ioctl是通過系統呼叫sys_ioctl軟中斷陷入到核心,通過系統中斷號最終呼叫到核心態的ioctl函式。

構造ioctl命令linux已經給我們提供了巨集命令:

_io    an ioctl with no parameters

_iow   an ioctl with write parameters (copy_from_user)

_ior   an ioctl with read parameters  (copy_to_user)

_iowr  an ioctl with both write and read parameters

/* type: 幻數(裝置相關的乙個字母,避免和核心衝突)

nr: 命令編號

datatype:資料型別

*/_io(type,nr) //無引數的命令

_ior(type,nr,datatype) //應用從驅動中讀資料

_iow(type,nr,datatype) //應用從驅動中寫資料

舉乙個簡單的例子:

//應用程式

#define motor_cmd_base'm'  

#define set_motor_step _iow(motor_cmd_base, 1u, int)

#define get_motor_step _iow(motor_cmd_base, 2u, int)

...int step= 0;

int value = 0;

int fd = -1;

fd = open("/dev/motor",o_rdwr);   

if (fd== -1)   

.  .  

printf("please input the motor step:/n"  

scanf("%d",&step);    

if(ioctl(fd, set_motor_step, &step)<0)  

if(ioctl(fd, get_motor_step, &value)<0)

...

//驅動程式

//假設該驅動程式建立了名為motor的字元裝置

#define motor_cmd_base'm'  

#define set_motor_step _iow(motor_cmd_base, 1u, int)

#define get_motor_step _iow(motor_cmd_base, 2u, int)

int motor_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)  

linux驅動 ioctl介面

核心中對底層裝置操作完全可以通過read write介面來實現,在linux 2.2之前都是沒有ioctl介面的,2.4以後才引入ioctl介面。典故 據說 以前在操作軟盤時,需要彈出光碟時命令為eject,可以通過write寫這個字串來傳輸這個指令,但是此時,如果要往軟盤中寫入 eject 字串時...

Linux系統呼叫 ioctl

ioctl 是裝置驅動程式中裝置控制介面函式,通過指定的命令來實現對應的操作。驅動程式long unlocked ioctl struct file unsigned int,unsigned long long compat ioctl struct file unsigned int,unsig...

linux系統ioctl使用示例

linux系統ioctl使用示例 these were writed and collected by kf701,you can use and modify them but no warranty.contact with me kf 701 21cn.com 程式1 檢測介面的 inet a...