日期:2014-05-16  浏览次数:20699 次

嵌入式Linux应用程序自动载入驱动模块方法

英利公司推出的嵌入式Linux工控板EM9160针对一些扩展应用,实现了相应的驱动程序,包括有精简ISA总线的操作驱动、GPIO、I2C、SPI、LCD、KeyPad、CAN驱动等。这些设备的驱动程序可以在内核启动后,通过启动脚本来自动加载,但是这种方式往往不够灵活,因为在实际的应用中,客户往往会根据实际情况加以选择。

??????? 基于这种情况,我们把驱动程序模块分为两类,第一类驱动针对于嵌入式Linux工控板EM9160直接引出的接口,如ISA总线、GPIO、LCD、I2C、SPI等,则直接通过内核启动脚本来实现自动载入。第二类针对于利用ISA总线进行的扩展应用驱动,如:Keypad 、CAN应用等,对于这类驱动在内核启动时并没有自行载入,需要客户可根据实际情况进行选择。本文将着重介绍如何在应用程序中实现自动载入第二类驱动模块的方法。

??????? 英利所提供的嵌入式Linux工控板的所有驱动库文件均放置在文件系统/lib/modules/2.6.30目录下。

??????? 系统内核自动载入驱动功能模块:
??????? /lib/modules/2.6.30/em9x60_sysinfo.ko
??????? /lib/modules/2.6.30/em9x60_isa.ko
??????? /lib/modules/2.6.30/em9x60_gpio.ko
??????? /lib/modules/2.6.30/em9x60_irq.ko
??????? /lib/modules/2.6.30/em9x60_pwm.ko
??????? /lib/modules/2.6.30/em9x60_i2c.ko
??????? /lib/modules/2.6.30/em9x60_lcd.ko

??????? 需要客户自行入载驱动功能模块:
??????? /lib/modules/2.6.30/em9x60_keypad.ko
??????? /lib/modules/2.6.30/em9x60_can.ko

??????? 在嵌入式Linux操作系统下,一般是利用insmod指令来实现向系统内核载入模块,如载入键盘驱动:
??????? # insmod /lib/modules/2.6.30/em9x60_keypad

??????? 在嵌入式应用中,往往是需要自动运行模式,这就需要通过编程来实现。因此在应用编程代码中,利用C++中的构造函数以及析构函数可以很好地实现驱动功能模块的自动载入和自动卸载,下面是以键盘为例来加以说明。

??????? 定义一个class KEYManager键盘管理类,在该类中主要实现对键盘的响应功能。

??????? 其构造函数:
??????? KEYManager::KEYManager( )
??????? {
??????????????? m_ExitThreadFlag = 0;
??????? ??????? system( 'insmod /lib/modules/2.6.30/em9x60_keypad.ko' ); // 载入键盘驱动模块
??????? }

??????? 对应的析构函数:
??????? KEYManager::~KEYManager( )
??????? {
??????????????? system( 'rmmod em9x60_key' ); // 卸载键盘驱动模块
??????? }

??????? 应用程序中,一旦定义了class KEYManager的实例就实现了键盘模块的自动载入。后续就可打开键盘设备文件,读取键码值,从而实现对键盘响应的功能。

??????? 在英利公司所提供的嵌入式Linux开发光盘上均有以上介绍的相关源码提供,以供客户参考。

来源:http://www.emlinix.com/jishu-blog/zhishi2010145.html