嵌入式linux如何操作硬件

原创 2013年12月04日 17:23:52

拿到Beaglebone Black以后,我最先考虑的是如何用它控制硬件,包括ARM片上的硬件资源和外接的各种设备。通过我的前几篇日志也给出了若干硬件的使用方法,但是总感觉缺乏条理。因此查了一些资料,在此做一点总结。


我们知道Linux系统分为用户空间和内核空间,系统调用函数和Linux API(本质上也是在使用系统调用)是内核空间和用户空间之间的接口,设备驱动程序是内核空间和机器硬件之间的接口。我们在用户空间想要访问硬件,必须通过系统调用操作驱动程序来实现。因为Linux中一切皆文件,所以对硬件的操作等同于对设备文件的操作。在Beaglebone中通过使用capemgr加载device tree文件来加载设备,通常设备经过加载以后就会出现在 /dev 目录中,我们可以在c语言程序中使用open()、close()、read()、write()、ioctl()等系统调用函数对其进行操作。这些函数操作的具体实现,就是在相应的驱动程序中定义的了,一般需要查询相应驱动的说明或阅读驱动源码来得知。


通常所说的驱动程序是属于内核空间的程序,编写驱动程序比较复杂、调试不方便而且有一定危险。实际上,在用户空间也可以编写简单的驱动程序,方法是利用 /dev/mem 这个设备,将芯片的寄存器映射到用户空间中,然后我们就可以像操作单片机一样控制芯片的外设了。一个很好的例子是这位仁兄写的C语言操作Beaglebone的GPIO的函数库,就是用这个方法实现的。感兴趣的话可以到这里去看一看他的思路和源代码 www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog/2013/10/10/bbb--beaglebone-black-io-library-for-c

必须了解的是,在用户空间的驱动程序有很多力不能及的地方,比如:无法使用中断、响应速度慢、很多设备不能在用户空间处理等等。


上面说的是在c程序中操作硬件的方法。但在shell中一般不能直接读写 /dev 目录下的设备文件,也不能进行ioctl()操作。如果我们想在shell中操作硬件怎么办?这就要用到 /sys 目录了。/sys 目录中存放着系统内核和驱动相关的内容,它是一个虚拟的文件系统,这个文件系统的目录结构实质上就是内核对象模型树。我们可以对这里的文件进行读写操作来实现对设备的操作。至于每个设备里都有哪些文件,操作哪些文件能产生什么效果,还是由设备驱动程序定义的了。(前提是设备驱动中设置了相应的sysfs,否则就没法在shell里访问了。)



以我之前的日志中对各种片上资源进行操作为例进行一下说明:
1、操作IO口是在shell中对/sys/class/gpio这个目录下的文件进行了一系列读写操作实现,因为gpio驱动是默认加载的,所以无需加载device tree就能实现操作;
2、使用ADC接口是在shell中对/sys/bus/iio/devices这个目录下的文件进行读写实现,操作之前先要加载相应的device tree;
3、操作UART比较特殊,直接对/dev/tty*进行写入来操作,之前同样需要先加载device tree;
4、使用I2C时利用了BMP085芯片的驱动,通过对/sys/bus/i2c/drivers/bmp085目录下的内容进行读取来操作,可能是因为这是一个比较早期的驱动,所以这里没有用到device tree;
5、操作SPI时先加载了device tree,然后在c程序中使用了ioctl()等系统调用实现功能。





相关文章推荐

Linux内核访问外设I O资源的方式

首先介绍一下I/O端口和I/O内存。 1. I/O端口:当一个寄存器或内存位于I/O空间时,称其为I/O端口。 2. I/O内存:当一个寄存器或内存位于内存空间时,称其为I/O内存。 再来看一下...

linux硬件访问技术

1.硬件访问实质驱动控制设备,主要通过访问设备内的寄存器;来达到控制目的的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器了。2.访问流程:包括地址映射和读写寄存器 地址映射:linux系统中,无...

基于ARM的Linux嵌入式系统如何操作GPIO口

深圳扬创科技的Linux工业平板电脑是一款基于ARM架构的Cortex-A8硬件平台,Linux2.6.30操作系统,QT库4.7.3版本,自带8入8出的GPIO口,方便用户控制,采集信号,GPIO口...
  • sqcg999
  • sqcg999
  • 2014年08月26日 09:13
  • 968

Linux下的IO端口和IO内存

说明:本文系通过阅读网络上诸多相关文章,整理而成。         设备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器也称为I/O端口,通常包括:控制寄存...
  • acs713
  • acs713
  • 2012年08月27日 10:34
  • 4034

linux内核中GPIO的使用(一)--IO内存

一、相关概念 使用IO内存将物理地址映射为虚拟地址,再通过对虚拟地址的操作来控制硬件。所谓的IO内存是指一种编址方式,不同cpu平台使用的编址方式不同,一种是“IO内存”方式,也叫统一编址方...

Linux中断机制之一:硬件处理

最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。不同的外部设备、不同的体系结构、不同的OS其中断实现机制都有差别,本文对应的OS为linux3.4版本,外部设备为PCI设备、系统...

ARM平台嵌入式Linux下SPI设备连接

在嵌入式ARM平台设备上,经常有在一个SPI bus上面挂接一个或者多个SPI设备的需求,由于挂载一个设备的情况比较简单,本文主要就在嵌入式Linux环境下挂载多个SPI设备进行说明。   本文所...

嵌入式linux中SPI应用开发

在嵌入式设备中用到spi的器件有很多,目前常见的有刷卡器、蓝牙模块等,都是通过spi总线来通信的。本文来讲解一下SPI应用程序开发的常见模式。 一 、 主要结构体 linux中,应用开发常用的结构...
  • cjyusha
  • cjyusha
  • 2015年12月25日 17:18
  • 2529

基于S3C2440的嵌入式Linux驱动——SPI子系统解读(一)

本文将介绍SPI子系统。内核版本为2.6.30。如有错误欢迎指正。 预备知识要求:1.SPI总线                        2. platfrom平台           ...

Linux文件系统底层实现

1、引言 Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式linux如何操作硬件
举报原因:
原因补充:

(最多只允许输入30个字)