Chinaunix首页 | 论坛 | 博客
  • 博客访问: 754631
  • 博文数量: 98
  • 博客积分: 4934
  • 博客等级: 上校
  • 技术积分: 1151
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-12 19:55
文章分类

全部博文(98)

文章存档

2014年(1)

2013年(2)

2012年(4)

2011年(25)

2010年(33)

2009年(33)

分类: LINUX

2009-06-12 20:08:28

1、I/O端口
   和硬件打交道离不开I/O端口,在Linux下,操作系统没有对I/O端口屏蔽,也就是是说,任意驱动程序都可以对任意的I/O口操作,这样就很容易引起混乱。每个驱动程序应该自己避免误用端口。有两个重要的kernel函数可以保证驱动程序做到这一点。
check_region(int io_port,int off_set)
这个函数查看系统的I/O表,看是否有别的驱动程序在占用某段I/O端口。
参数1:I/O端口的基地址。
参数2:I/O端口占用的范围。
返回值:0-没有被占用;非0-已经被占用。
 
request_region(int io_port,int off_set,char* devname)
如果这段I/O口没有被占用,在驱动程序中就可以使用它。在使用之前,必须向系统登记,以防其被其他程序占用,登记后,在/proc/ioports文件中可以看到登记的I/O口。
参数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文档所提供的标准控制字中选择合适
      的控制字,如果选择不合适会造成和系统中的其他设备冲突。
阅读(782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~