基于OMAPL138的Linux设备驱动程序开发入门

Revision History
Draft Date Revision No. Description
2016/05/25 V1.1 1.模板更新。
2015/01/27 V1.2 1.优化按键设备驱动程序。
2.优化按键设备驱动测试程序。
2014/12/21 V1.1 1.修改LED设备驱动测试方法。
2.优化LED、按键设备驱动程序。
2013/12/25 V1.0 1.初始版本。

目 录
1 LED设备驱动程序 3
1.1 LED设备驱动程序解析 3
1.2 编译LED设备驱动程序 6
1.3 LED设备驱动测试脚本解析 8
2 按键设备驱动程序 9
2.1 按键设备驱动程序解析 9
2.2 编译按键设备驱动程序 13
2.3 按键设备驱动测试程序解析 15
2.4 编译设备驱动测试程序 17
3 设备驱动模块静态编译进内核 17
更多帮助 20

1LED设备驱动程序
1.1LED设备驱动程序解析
开发板LED编号和GPIO对应关系如下:

表 1
开发板型号 GPIO0[0] GPIO0[5] GPIO0[1] GPIO0[2]
TL138/1808-EVM D7 D6 D9 D10
TL138/1808-EasyEVM D7 D6 D9 D10
TL138/1808-EthEVM D7 D6 D9 D10
TL138/1808F-EasyEVM \ GD1 GD2 GD3
TL138/1808F-EVM \ D1 D2 D3

开发板资料光盘中有LED设备驱动程序源码,其路径为:

led.c:demo\driver\linux-3.3\led\led.c
下面以TL138/1808-EVM开发板为例讲解此设备驱动程序。
#include
#include
#include
#include
#include
#include

/* 因为使用了平台相关的头文件,所以编译时需要ARCH=arm */
#include
#include
#include
#include

/*定义4个用户LED对应的GPIO,开发板LED对应编号分别是D7,D6,D9,D10 */
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)

/* assign the tl som board LED-GPIOs*/
static const short da850_evm_tl_user_led_pins[] = {
/* These pins are definition at file */
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
-1
};

/定义4个LED对应的GPIO号、有效电平(熄灯电平)、名称、触发模式等/
/使用Linux提供的标准gpio-led框架/
static struct gpio_led da850_evm_tl_leds[] = {
{
.active_low = 0, /有效电平(熄灯电平):低电平/
.gpio = DA850_USER_LED0, /GPIO号:LED对应gpio管脚/
.name = “user_led0”, /名称:对应/sys/class/leds/下的名称/
.default_trigger = “default-on”, /触发模式:默认点亮/
},
{
.active_low = 0,
.gpio = DA850_USER_LED1,
.name = “user_led1”,
.default_trigger = “default-on”,
},
{
.active_low = 0,
.gpio = DA850_USER_LED2,
.name = “user_led2”,
.default_trigger = “default-on”,
},
{
.active_low = 0,
.gpio = DA850_USER_LED3,
.name = “user_led3”,
.default_trigger = “default-on”,
},
};

static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
.leds = da850_evm_tl_leds,
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
};

static void led_dev_release(struct device *dev)
{
};

/使用Linux提供的标准platform_device 框架/
static struct platform_device da850_evm_tl_leds_device = {
.name = “leds-gpio”,
.id = 1, /先确定id号是否被使用,此id是platform_device的id,跟LED个数无关/
.dev = {
.platform_data = &da850_evm_tl_leds_pdata,
.release = led_dev_release,
}
};

static int __init led_platform_init(void)
{
int ret;

#if 0
/使用davinci pinmux设置接口,把LED对应的管脚配置成gpio模式/
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
if (ret)
pr_warning(“da850_evm_tl_leds_init : User LED mux failed :”
“%d\n”, ret);
#endif

/注册LED device设备,系统LED框架将会接收到这个注册,生成相应LED节点/
ret = platform_device_register(&da850_evm_tl_leds_device);
if (ret)
pr_warning(“Could not register som GPIO expander LEDS”);
else
printk(KERN_INFO “LED register sucessful!\n”);

return ret;

}

static void __exit led_platform_exit(void)
{
platform_device_unregister(&da850_evm_tl_leds_device);

printk(KERN_INFO "LED unregister!\n");

}

module_init(led_platform_init);
module_exit(led_platform_exit);

MODULE_DESCRIPTION(“Led platform driver”);
MODULE_AUTHOR(“Tronlong”);
MODULE_LICENSE(“GPL”);

以上是LED设备驱动程序解析,对于Linux对LED设备框架,这里稍微说明一下:

(1)Linux的LED设备类在内核"Documentation/leds/leds-class.txt"文件有详细说明。
(2)注册一个LED设备成功后,会"/sys/class/leds/"生成相应的设备节点。
(3)用户可以通过读写节点目录下的brightness文件控制LED亮灭。
对于GPIO口的操作,有以下几点步骤:
(1)查看开发板的原理图,找到与LED连接的GPIO。TL138/1808-EVM开发板与LED连接的GPIO分别是GPIO0[5]、GPIO0[0]、GPIO0[1]、GPIO0[2]。
(2)查看OMAP-L138的数据手册,查找对应PINMUX寄存器的地址,将对应的管脚的寄存器中相应位设置为GPIO的工作模式。本例中使用的是PINMUX1。
(3)设置GPIO的方向寄存器。本例程中将GPIO口配置为输出。
(4)配置GPIO的数据寄存器,写"1"表示输出高电平,写"0"表示输出低电平。
1.2编译LED设备驱动程序
此处使用Makefile编译LED设备驱动程序。工程中源文件有时候很多,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
开发板资料光盘中有LED设备驱动程序Makefile文件,其路径为:
Makefile: demo\driver\linux-3.3\led\Makefile
以下为LED设备驱动程序Makefile文件的解析:
ifneq ($(KERNELRELEASE),)
obj-m := led.o /定义了要编译的驱动文件为led.c,生成的模块名字为led.ko/
else
/以下定义运行编译命令时使用的内核源码、驱动源码路径、平台、使用的交叉编译工具链等参数/
all:
make -C ( K D I R ) M = (KDIR) M= (KDIR)M=(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
/定义运行"make clean"时清除的文件/
clean:
rm -rf *.ko *.o *.mod.o .mod.c .symvers modul .button. .tmp_versions

#help: make KDIR=
endif

基于OMAPL138的Linux设备驱动程序开发入门_第1张图片

将光盘"demo\driver\linux-3.3\led"的led.c和Makefile文件复制到开发系统Ubuntu任意路径,并在led.c和Makefile目录运行以下命令编译LED设备驱动程序:

Host# make KDIR=/home/tl/omapl138/linux-3.3

基于OMAPL138的Linux设备驱动程序开发入门_第2张图片

"KDIR=/home/tl/omapl138/linux-3.3"是内核源码路径,在运行前必须已正确编译过内核源码。运行以上命令后,系统会根据Makefile文件的规则去编译整个驱动源码,产生了驱动程序镜像文件led.ko和其他中间文件。

1.3LED设备驱动测试脚本解析
开发板资料光盘有LED设备驱动测试脚本,运行此测试脚本LED会循环点亮。其路径为:
led_loop.sh :demo\app\led\led_loop.sh
以下为测试脚本的解析:
#init all user led #关闭所有LED灯
echo 0 > /sys/class/leds/user_led0/brightness
echo 0 > /sys/class/leds/user_led1/brightness
echo 0 > /sys/class/leds/user_led2/brightness
echo 0 > /sys/class/leds/user_led3/brightness

DELAY_TIME=0.5 #定义流水灯延时时间

#led loop
while true; do
echo 1 > /sys/class/leds/user_led0/brightness #点亮LED0 D7
sleep $DELAY_TIME
echo 0 > /sys/class/leds/user_led0/brightness #关闭LED0 D7
echo 1 > /sys/class/leds/user_led1/brightness
sleep $DELAY_TIME
echo 0 > /sys/class/leds/user_led1/brightness
echo 1 > /sys/class/leds/user_led2/brightness
sleep $DELAY_TIME
echo 0 > /sys/class/leds/user_led2/brightness
echo 1 > /sys/class/leds/user_led3/brightness
sleep $DELAY_TIME
echo 0 > /sys/class/leds/user_led3/brightness
done

具体的LED测试步骤请查看用户手册快速体验相关小节。

更多帮助
销售邮箱:[email protected]
技术邮箱:[email protected]
创龙总机:020-8998-6280
技术热线:020-3893-9734
创龙官网:www.tronlong.com
技术论坛:www.51ele.net
线上商城:https://tronlong.taobao.com
TMS320C6748、OMAPL138交流群:227961486、324023586
TI中文论坛:http://www.deyisupport.com/
TI英文论坛:http://e2e.ti.com/
TI官网:www.ti.com
TI WIKI:http://processors.wiki.ti.com/

你可能感兴趣的:(创龙)