并口
发表于:2007-07-04来源:作者:点击数:
标签:
两种方式 一 驱动程序执行方式 1.申请I/O端口 A 直接端口方式 check_region request_region B内存映射方式 check_mem_region request_mem_retion 然后队端口地址映射 ioremap 2.注册驱动 register_chrdev 申请主设备号,注册驱动名,相关的操作. 3.探测中断 A
两种方式
一 驱动程序执行方式
1.申请I/O端口
A 直接端口方式
check_region
request_region
B内存映射方式
check_mem_region
request_mem_retion
然后队端口地址映射
ioremap
2.注册驱动
register_chrdev 申请主设备号,注册驱动名,相关的操作.
3.探测中断
A 内核探测
B 定制探测
C 直接根据I/O地址,分配相应的IRQ号
4.安装中断相应处理函数
request_irq(irq,(*)Handler()...)
A 共享中断的处理函数
端口有中断到,则判断时不时本端口的中断.若是.则填充缓冲区.同时wake_up_interruptible,唤起等待序列.
在read操作中的队列由signal_pending唤醒,拷贝数据到用户空间.
B 下半部中断的处理函数
通过queue_task,执行队列处理函数唤起中断.
C 小任务中断处理函数
通过tasklet_schedule执行小任务处理函数唤起中断.
二 应用程序执行方式.
- 通过 ioperm 命令,例如,ioperm ( BASE, range , 1),调用内核,得到 I/O 地址空间的使用权;
- 通过一个发送请求指令,例如, outb(1, BASE ) ,
- 等待足够的时间让咖啡煮好,让时间参数在命令行中被读取是一件很好的事情
- 然后发送 out(0, BASE) 指令关掉咖啡机
- 在结束之前还应归还并口 I/O 地址的使用权, ioperm(BASE,range,0) .
程序:/* coffee.c */
#include <asm/io.h> /*
linux-specific */
#ifdef __GLIBC__
# include <sys/perm.h>
#endif
int main(int argc, char **argv)
{
setuid(0); /* if we're setuid, force it on */
if(ioperm(0x378,1,1))
printf("error,we can't ioperm our ox378 port\n");
outb(0xff,0x378);
sleep(5);
outb(0,0x378);
if(ioperm(0x378,1,0))
printf("error,we can't ioperm our ox378 port\n");
exit(1);
}
三 在驱动程序中如何取得被其它驱动程序使用的并口
首先 cat /proc/ioports 看端口地址是分配给谁了.
然后看该名字的 ls -l /dev/port_name
找到主设备号和次设备号
然后 cat /proc/devices 看主设备好对应的驱动
然后rmmod 该驱动.
如果是编译到了内核的驱动则只需在/lib/module/`uname -r`/kernel/drivers/ 删除该名字的驱动,
则重起后,该驱动就不会暂用该端口了,但这个驱动的名字不一定在/proc/devices 中出现
原文转自:http://www.ltesting.net