参数1:I/O端口的基地址。
参数2:I/O端口占用的范围。
参数3:使用这段I/O地址的设备名。
在对I/O端口登记后,就可以放心地使用inb(),outb()之类的函数来访问了。
2、内存操作
在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者使用get_free_pages直接申请页。释放内存使用的是kfree或free_pages。
3中断处理
同处理I/O端口一样,要使用一个中断,必须先向系统登记。
int request_irq(unsigned int irq,
void(*handle)(int,void*,struct pt_regs*),
unsigned int long flags,
const char* device);
irq:要申请的中断。
bandle:中断处理函数指针。
flags:SA_INTERRUPT-请求一个快速中断;0-正常中断。
device:设备名。
如果登记成功,返回0,这时在/proc/interrupts文件中可以看到请求的中断。
4、和设备文件对话
驱动程序提供了对设备操作的接口,同时在程序中实现了基本操作所需要的基本函数,用户程序通过访问设备文件的方式对设备间接操作,Linux系统提供了ioctl()函数可以很方便的实现这一操作。
int ioctl(int fd,int cmd,...);
fd:用户程序打开设备时使用open函数返回的文件标识符。
cmd:用户程序对设备的控制命令。
省略号:一些补充参数,一般多于一个,有或没有是和cmd的意义相关的。
注意:cmd设备的控制命令选择需要根据Linux文档所提供的标准控制字中选择合适
的控制字,如果选择不合适会造成和系统中的其他设备冲突。