1 引言
Linux操作系统因具有源代码公开、便于裁减、有广泛的处理器支持等优点,成为当前嵌入式系统的热门选择。基于I2C总线的键盘扩展设备主要用于满足嵌入式设备中对多按键的需求,驱动程序在系统启动时对硬件进行初始化。在系统启动后实现硬件和应用程序之间的数据交互。针对S3C2410微处理器和键盘扫描管理器件,深入讨论如何在嵌入式操作系统ARM Linux中实现ZLG7290的驱动。
2 I2C总线
I2C总线是器件间串行传输总线,以其规范和带I2C接口的外围器件获得广泛应用。S3C2410处理器内置有I2C总线接口。I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,每个器件都有一个唯一的地址识别。I2C总线在传送数据过程中共有3种信号:(1)开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。(2)结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。(3)应答信号:接收数据的IC接收到8 bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。若未收到应答信号,则判断为受控单元出现故障。图1为S3C2410和ZLG7290的连接图。
3 驱动模块的结构
S3C2410A内嵌一个I2C总线控制器。在Linux操作系统中,该控制器的字符型驱动包括4个模块:(1)i2c-dev:源程序为i2c-dev.c,I2C总线字符型驱动,与具体使用的I2C控制器无关。(2)i2c-core:源程序为i2c-core.c,I2C总线操作核心函数,与具体使用的I2C控制器无关。(3)i2c-algo-s3c2410:源程序为i2c-algo-s3c2410.c,I2C总线控制器I2C驱动算法,与具体的控制器相关。(4)i2c-s3c2410:源程序为i2c-s3c2410.c,I2C总线控制器硬件抽象层,与具体的控制器相关。以上4个模块依次是底层与上层的关系,I2C驱动模块的层次结构如图2所示。
4 驱动源文件的编译
驱动源文件包括i2c-algo-s3c2410.c,i2c-dev.c,i2c-core.c,i2c-s3c2410.c4个源文件。将其编译为模块,则产生4个模块文件,编译工作由Makefile文件完成,其文件内容如下: