如何驱动GPIO及对应设备

时间:2008-12-24

  一般的ARM都提供超过100路的GPIO复用管脚,要使用这些管脚,就必须首先将其驱动起来。如果使用的芯片带有MMU内存管理,那么在写驱动模块的时候不能直接去操作物理地址,必须利用io rem ap命令重新映射。

  1.I/O端口

  和硬件打交道离不开I/O端口,老的ISA设备经常是占用实际的I/O端口,在Linux下,操作系统没有对I/O端口屏蔽。也就是说,任何驱动程序都可以对任意的I/O端口操作,这样就很容易引起混乱。每个驱动程序都应该自己避免误用端口,有两个重要的kernel函数可以保证驱动程序做到这一点。

  check_reglon(int io_ port' int off_set)

  这个函数用来查看系统的I/0表,看是否有别的驱动程序占用某一段I/O口。参数1:I/O端口的基地址;参数2:I/O端口占用的范围。返回值:0,没有占用;非0,己经被占用。

  request_reglon(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口登记后,就可以放心地用inb0,outb()之类的函数来访问了。

  2.和设备文件对话

  驱动程序提供了对设备操作的接口,同时在程序中实现了基本操作所需要的基本函数。用户程序通过访问设备文件的方式对设备间接操作,Linux系统提供了ioctl(input outputcontrol的缩写)函数可以很方便地实现这一操作。

  int ioctl(int fd' ind cmd、……);

  其中,fd就是用户程序打开设备时使用open函数返回的文件标识符;cmd就是用户程序对设备的控制命令:后面的省略号,那是一些补充参数,一般多一个,有或没有是和cmd的意义相关的。

  选择设备的控制命令时,需要根据Linux文档所提供的标准控制字(Documentation/ioctl-number.txt)中选择的合适控制字,如果选择不合适会和系统中的其他设备发生冲突。

  



  
上一篇:用户程序访问GPIO
下一篇:GPIO应用举例

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料