void
request_region(unsigned long from,
unsigned long num, const char *name)
这个函数用来申请一块输入输出区域。
如果这段I/O端口没有被占用,在我们的驱动程序中就可以使用它。在使用之前,必须向系统登记,以防止被其他程序占用。登记后,在/proc/ioports文件中可以看到你登记的io口。
参数1:io端口的基地址。
参数2:io端口占用的范围。
参数3:使用这段io地址的设备名。
在对I/O口登记后,就可以放心地用inb(), outb()之类的函来访问了。
********************************************************************************************
request_region()用于内核为驱动“分配”端口,这里分配的意思是,记录该端口已经被某个进程使用,要是其它进程试图访问它,就会产生“忙”错误。所以目的在于实现资源的互斥访问。
反之, 如果一个资源只被一个进程访问,不会导致资源的争用,这时 request_region()是可选的。
********************************************************************************************
void release_region(unsigned long from, unsigned long num)
这个函数用来释放一块输入输出区域。
********************************************************************************************
几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。
io-map的寄存器用outb/w/l,inb/w/l指令访问
mem-map的寄存器直接用指针赋值即可,但是由于对内存访问可能被gcc优化掉,所以最好使用linux提供的包装函数:readb/w/l,writeb/w/l。
unsigned long num, const char *name)
这个函数用来申请一块输入输出区域。
如果这段I/O端口没有被占用,在我们的驱动程序中就可以使用它。在使用之前,必须向系统登记,以防止被其他程序占用。登记后,在/proc/ioports文件中可以看到你登记的io口。
参数1:io端口的基地址。
参数2:io端口占用的范围。
参数3:使用这段io地址的设备名。
在对I/O口登记后,就可以放心地用inb(), outb()之类的函来访问了。
********************************************************************************************
request_region()用于内核为驱动“分配”端口,这里分配的意思是,记录该端口已经被某个进程使用,要是其它进程试图访问它,就会产生“忙”错误。所以目的在于实现资源的互斥访问。
反之, 如果一个资源只被一个进程访问,不会导致资源的争用,这时 request_region()是可选的。
********************************************************************************************
void release_region(unsigned long from, unsigned long num)
这个函数用来释放一块输入输出区域。
********************************************************************************************
几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。
io-map的寄存器用outb/w/l,inb/w/l指令访问
mem-map的寄存器直接用指针赋值即可,但是由于对内存访问可能被gcc优化掉,所以最好使用linux提供的包装函数:readb/w/l,writeb/w/l。
io-map也有相应的包装函数/宏。
字符设备驱动程序:
1.初始化init,初始化设备,注册驱动程序到内核
2.入口函数集,如open close ioctl llseek rw等,对应相应的IO系统调用,通过/dev
3.中断,底半部,定时器例程,内核辅助线程,其他。
关键数据结构:自定义,struct dev ,struct file_operations ,struct file