物联网数据采集器硬件设计
2021-11-11高学群
■ 高学群
Linux 系统作为嵌入式操作系统有着明显的优势,首先,Linux源代码是开放的,全球的Linux 爱好者都是在不断地开发完善Linux内核;其次,Linux 系统内核很小,最小可达约134KB。同时Linux 内核的更新速度很快并且可以定制。Linux 一大亮点就是免费。Linux 适应多种CPU 硬件平台表现了嵌入式操作系统必须的特色。如今,Linux 操作系统不仅支持二三十种CPU,而且容易开发、使用和性能良好。Linux的平台移植成为CPU 芯片行业的热门项目,移植速度更是超过了Java。在网络方面,Linux 内核的结构更有优势,能够完备的支持TCP/IP 协议并且能够提供了最高千兆的以太网以及无线等网络支持。
本设计选用Linux作为软件平台进行开发,内核版本2.6.39。
1 基于Linux 的设备驱动介绍
设备驱动在字面可以清楚的理解为“驱使硬件设备行动”。驱动是与底层硬件接触,而不同硬件设备具有不同的工作方式,所以驱动要按照具体的工作方式读写硬件设备寄存器,完成中断处理、物理内存向虚拟内存的映射等,使设备各功能能够正常工作,如能够收发数据的通信设备,能显示文字的显示设备等。
驱动的对象不是CPU 内核而是存储器和外设。Linux把存储器和外设分为字符设备、块设备和网络设备。字符设备是像触摸屏、鼠标之类的以串行顺序依次进行访问的设备。块设备是可以用任意顺序进行访问并经过系统的快速缓冲的设备。虽然字符设备不经过系统的快速缓冲,但是它们之间并没有明显的界限,就像有块设备特点的Flash 设备,也可以把它看成一个字符设备来访问。网络设备主要是接收和发送数据包。
2 设计的嵌入式Linux 驱动程序设计
2.1 串口底层驱动程序
异步串口是通信最常用的资源。RS-232 和RS-485都是串行数据接口标准。RS-485比RS-232在传输速度、距离等方面都有着明显优势,同时一条总线上最多可连接32 个接收器。由于它们的时序完全一样,只是在电气特性上有所区别,所以它们之间也很容易实现转换。
串口驱动位于tty 子系统。对于用户来说,访问串口与访问其它字符设备的方法一样,都是通过系统调用访问设备文件从而访问设备。串口主要有open 函数,read函数,write函数。因此驱动程序中也要实现这三个实现函数,如图1 串口驱动包含以下部分:
图1 串口驱动程序结构
本设计基于Linux-2..639内核源码完成对串口驱动程序的开发。其主要代码在linux-2.6.39drivers tyserialatmel_serial.c 中实现。其中部分函数如下:
(1)驱动加载与卸载函数
(2)开始发送数据
本设计基于Linux-2..639内核源码完成对串口驱动程序的开发。其主要代码在linux-2.6.39drivers tyserialatmel_serial.c 中实现。其中部分函数如下:
(1)驱动加载与卸载函数
(2)开始发送数据
2.2 以太网口底层驱动程序
在物联网发展的今天,嵌入式系统都会拥有网络模块。以太网作为通信接口有着传输速度快、稳定等优点。它也可以作为嵌入式系统开发的调试的接口。Linux网络驱动程序的体系结构如图2 所示
图2 Linux 网络驱动程序的体系结构
网络设备接口及以上层次的源码都可以通过Linux 内核中找到,因此对于特定网络硬件驱动程序的移植关键在于设备驱动功能层,包含接收数据、发送数据等控制。所有网络设备在Linux 中都可以抽象为一个接口,网络设备在内核中的运行情况由网络设备接口(结构体struct net_device)来表示。以dev_base 为头指针的设备链表(每个元素代表一个网络设备接口)管理着所有网络设备。大部分供系统访问和协议层调用的设备方法都在结构体net_device 中,有init 函数(初始化)、open 和stop 函数(设备打开关闭)、hard_start_xmit 函数(数据包发送)以及中断处理函数等。
本设计基于Linux-2.6.39内核源码完成对网口驱动程序的开发。其主要代码在linux-2.6.39drivers etfec.c中实现。其中部分功能如下:
(1)网络设备驱动程序的模块加载与卸载函数
(2)网络设备驱动的初始化
(3)网络设备打开与释放
(4)数据包发送函数
2.3 液晶显示底层驱动程序
嵌入式处理器能够提供一个良好的人机交互平台,屏幕主要有LCD,液晶等。帧缓冲存储器是Linux 操作系统提供一个接口,以便连接显示设备,并且能够让上层应用程序直接进行读写显示缓冲区,方便用户使用。
fbmem.c 中的file_operations 结构体是帧缓冲设备提供给用户空间的,对应的xxxfb.c 文件实现对于特定帧缓冲设备关于fb_info结构体的注册与注销等,以及fb_ops中成员函数,LCD 控制器硬件寄存器由fb_ops 中成员函数操作。Linux 帧缓冲设备驱动程序结构见图3。
图3 帧缓冲设备驱动的程序结构
本设计基于Linux-2.6.39内核源码完成对显示屏驱动程序的开发。其主要代码在linux-2.6.39driversvideoatmel_lcdfb.c 中实现。其中部分函数如下:
(1)帧缓冲设备驱动的模块加载与卸载函数
(2)平台驱动的探测与移除函数
(3)帧缓冲设备驱动的读写函数
2.4 按键输入底层驱动程序
在嵌入式系统中,有许多输入设备,如触摸屏、按键、鼠标等。本设计采用了6 个按键完成输入功能,其底层驱动的结构如图4。
图4 按键驱动程序结构
(1)按键驱动模块的加载和卸载函数
(2)实现设备操作函数