Beaglebone默认自带的MicroSD卡中装的的是Angstrom Distribution。我下载了TI官方的Linux SDK,重新编译了U-boot,kernel后烧录到microSD卡中,目前Beaglebone上电后能够使用putty进入到Arago的运行界面。我下面的工作是再Arago下开发一些外设的驱动,比如GPIO,CAN,SPI,LCD等,完全没有头绪该怎么样开始。以控制板载的LED为例,在Arago环境下,我怎样开发一个驱动,能闪烁beaglebone的四个板载LED呢?有没有一些好的资料或者开发指南可以共享?谢谢。
Yaoming Qin:
建议您直接使用 ezsdk
培训资料可以参考 http://processors.wiki.ti.com/index.php/Sitara_Linux_Training
Jiang Panfeng:
回复 Yaoming Qin:
Yaoming,您好!
谢谢你的回复。我这几天看了一下你发的链接中的Linux training资料,但是大部分内容是讲直接下载并编译TI的kernel、uboot或者其他应用的源码,重新编译。kernel、uboot我已经能编译而且烧到uSD卡中启动beaglebone了。我的问题在于如何修改内核或者添加驱动以支持我自己的应用。比如以驱动GPIO为例,网上下载的ezsdk编译后运行在beaglebone上时其4个user led是不亮的。我的第一个应用是利用beaglebone的4个user led做一个跑马灯程序。有几个问题请教你:
1. TI Linux EZSDK 和 PSP的关系和区别是什么?在编译内核时根据
http://processors.wiki.ti.com/index.php/AMSDK_Linux_User%27s_Guide
链接中的内容,其配置文件对于SDK使用tisdk_am335x-evm_defconfig,而对于PSP使用am335x_evm_defconfig
$make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm tisdk_am335x-evm_defconfig
2. 我在arch/arm/arch-omap2/board-am335xevm.c 文件中增加了如下内容(想点亮beaglebone上的LED0和LED1):
static struct gpio_led jpf_gpio_leds[] = { { .name = "jpf::usr0", .default_trigger = "heartbeat", .gpio = GPIO_TO_PIN(1, 21), /* LED0 */ }, { .name = "jpf::usr1", .default_trigger = "mmc0", .gpio = GPIO_TO_PIN(1, 22), /* LED1 */ },};
static struct gpio_led_platform_data jpf_gpio_led_info = { .leds = jpf_gpio_leds, .num_leds = ARRAY_SIZE(jpf_gpio_leds),};
static struct platform_device jpf_leds_gpio = { .name = "jpf-leds-gpio", .id = -1, .dev = { .platform_data = &jpf_gpio_led_info, },};
static struct platform_device *jpf_bone_devices[] __initdata = { &jpf_leds_gpio,};
//my GPIO pin muxstatic struct pinmux_config jpf_gpio_led_mux[] = { /* User LED gpios (gpio1_21 to gpio1_24) */ {"gpmc_a5.gpio1_21", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT}, {"gpmc_a6.gpio1_22", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT}, {NULL, 0},};//
static void jpf_gpio_led_init(int evm_id, int profile){ int err;
setup_pin_mux(jpf_gpio_led_mux); //err = platform_device_register(&jpf_leds_gpio); err = platform_add_devices(jpf_bone_devices, ARRAY_SIZE(jpf_bone_devices)); if (err) pr_err("failed to register JPF gpio led device\n");}
同时,在beaglebone_dev_cfg中添加了初始化的函数
static struct evm_dev_cfg beaglebone_dev_cfg[] = {……………………………………………….
{jpf_gpio_led_init, DEV_ON_BASEBOARD, PROFILE_NONE},
………………………………………………
};
重新编译内核后在/sys/devices/platform下面倒是出现了一个新设备jpf-leds-gpio。但是怎么用它控制LED呢?
有没有一个step by step的文档来说明怎么添加一个全新的驱动呢?比如怎么修改arch/arm/arch-omap2/board-am335xevm.c文件?是否还需修改其他的文件呢?
不好意思,我刚刚学习嵌入式linux开发,所以问的问题可能不是很合适。
谢谢你的支持。
Yaoming Qin:
回复 Jiang Panfeng:
TI不提供step by step开发驱动的文档,因为:
1. TI的驱动都是按照标准的Linux驱动的编写的。
2. TI不是Linux开发公司
所以您可以通过google查找Linux驱动的各种资料,实际上也非常多,关于寄存器的配置,或者TI驱动特别配置的地方,可以参考我们的wiki
Jiang Panfeng:
回复 Yaoming Qin:
好的,谢谢回复。
能否把上面第一个问题回答一下?
1. TI Linux EZSDK 和 PSP的关系和区别是什么?在编译内核时根据
http://processors.wiki.ti.com/index.php/AMSDK_Linux_User%27s_Guide
中的内容,其配置文件对于SDK使用tisdk_am335x-evm_defconfig,而对于PSP使用am335x_evm_defconfig
tisdk_am335x-evm_defconfig和am335x_evm_defconfig的区别在哪里?为什么会有这种区别?谢谢!
Jiang Panfeng:
回复 Yaoming Qin:
知道了,谢谢