嵌入式Linux之我行——LED驅動在2440上的執行個體開發

來源:互聯網
上載者:User

嵌入式Linux之我行——LED驅動在2440上的執行個體開發

一、開發環境

  • 主  機:VMWare--Fedora 9
  • 開發板:Mini2440--64MB Nand
  • 編譯器:arm-linux-gcc-4.3.2

二、實現步驟

1. 硬體原理圖分析。由原理圖得知LED電路是共陽極的,並分別由2440的GPB5、GPB6、GPB7、GPB8口控制的

 

 

2. 去掉核心已有的LED驅動設定,因為IO口與mini2440開發板的不一致,根本就不能控制板上的LED。

#gedit arch/arm/plat-s3c24xx/common-smdk.c //注釋掉以下內容</p><p>/* LED devices */<br />/*<br />static struct s3c24xx_led_platdata smdk_pdata_led4 = {<br /> .gpio = S3C2410_GPF4,<br /> .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,<br /> .name = "led4",<br /> .def_trigger = "timer",<br />};</p><p>static struct s3c24xx_led_platdata smdk_pdata_led5 = {<br /> .gpio = S3C2410_GPF5,<br /> .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,<br /> .name = "led5",<br /> .def_trigger = "nand-disk",<br />};</p><p>static struct s3c24xx_led_platdata smdk_pdata_led6 = {<br /> .gpio = S3C2410_GPF6,<br /> .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,<br /> .name = "led6",<br />};</p><p>static struct s3c24xx_led_platdata smdk_pdata_led7 = {<br /> .gpio = S3C2410_GPF7,<br /> .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,<br /> .name = "led7",<br />};</p><p>static struct platform_device smdk_led4 = {<br /> .name = "s3c24xx_led",<br /> .id = 0,<br /> .dev = {<br /> .platform_data = &smdk_pdata_led4,<br /> },<br />};</p><p>static struct platform_device smdk_led5 = {<br /> .name = "s3c24xx_led",<br /> .id = 1,<br /> .dev = {<br /> .platform_data = &smdk_pdata_led5,<br /> },<br />};</p><p>static struct platform_device smdk_led6 = {<br /> .name = "s3c24xx_led",<br /> .id = 2,<br /> .dev = {<br /> .platform_data = &smdk_pdata_led6,<br /> },<br />};</p><p>static struct platform_device smdk_led7 = {<br /> .name = "s3c24xx_led",<br /> .id = 3,<br /> .dev = {<br /> .platform_data = &smdk_pdata_led7,<br /> },<br />};*/</p><p>

 

static struct platform_device __initdata *smdk_devs[] = {<br /> &s3c_device_nand,<br /> /*&smdk_led4,<br /> &smdk_led5,<br /> &smdk_led6,<br /> &smdk_led7,*/<br />};<br />

 

void __init smdk_machine_init(void)<br />{<br /> /* Configure the LEDs (even if we have no LED support)*/<br /> /*<br /> s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);<br /> s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);<br /> s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);<br /> s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP);</p><p> s3c2410_gpio_setpin(S3C2410_GPF4, 1);<br /> s3c2410_gpio_setpin(S3C2410_GPF5, 1);<br /> s3c2410_gpio_setpin(S3C2410_GPF6, 1);<br /> s3c2410_gpio_setpin(S3C2410_GPF7, 1);*/</p><p> if (machine_is_smdk2443())<br /> smdk_nand_info.twrph0 = 50;</p><p> s3c_device_nand.dev.platform_data = &smdk_nand_info;</p><p> platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));</p><p> s3c_pm_init();<br />}<br />

 

3. 編寫適合mini2440開發板的LED驅動,代碼如下,檔案名稱:my2440_leds.c

 

/*<br /> ==============================================<br /> Name : my2440_leds.c<br /> Author : Huang Gang<br /> Date : 05/11/2009<br /> Copyright : GPL<br /> Description : my2440 leds driver<br /> ==============================================<br /> */</p><p>#include <linux/kernel.h><br />#include <linux/module.h><br />#include <linux/init.h><br />#include <linux/fs.h><br />#include <linux/errno.h><br />#include <mach/hardware.h><br />#include <mach/regs-gpio.h></p><p>#define DEVICE_NAME "my2440_leds" //裝置名稱<br />#define LED_MAJOR 231 //主裝置號<br />#define LED_ON 1 //LED亮狀態<br />#define LED_OFF 0 //LED滅狀態</p><p>static unsigned long led_table[] = //控制LED的IO口<br />{<br /> S3C2410_GPB5,<br /> S3C2410_GPB6,<br /> S3C2410_GPB7,<br /> S3C2410_GPB8,<br />};</p><p>static unsigned int led_cfg_table[] = //LED IO口的模式<br />{<br /> S3C2410_GPB5_OUTP,<br /> S3C2410_GPB6_OUTP,<br /> S3C2410_GPB7_OUTP,<br /> S3C2410_GPB8_OUTP,<br />};</p><p>static int leds_open(struct inode *inode, struct file *file)<br />{<br /> return 0;<br />}</p><p>static int leds_ioctl(struct inode *inode, struct file *file,<br /> unsigned int cmd, unsigned long arg)<br />{<br /> //檢測是第幾個LED,因開發板上只有4個,索引從0開始<br /> if(arg < 0 || arg > 3)<br /> {<br /> return -EINVAL;<br /> }</p><p> //判斷LED要執行哪種狀態<br /> switch(cmd)<br /> {<br /> case LED_ON:<br /> {<br /> s3c2410_gpio_setpin(led_table[arg], ~(LED_ON));<br /> break;<br /> }<br /> case LED_OFF:<br /> {<br /> s3c2410_gpio_setpin(led_table[arg], ~(LED_OFF));<br /> break;<br /> }<br /> default:<br /> {<br /> return -EINVAL;<br /> }<br /> }</p><p> return 0;<br />}</p><p>static struct file_operations leds_fops =<br />{<br /> .owner = THIS_MODULE,<br /> .open = leds_open,<br /> .ioctl = leds_ioctl,<br />};</p><p>static int __init led_init(void)<br />{<br /> int ret, i;</p><p> for(i = 0; i < 4; i++)<br /> {<br /> //初始化各IO口為輸出模式<br /> s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);</p><p> //由原理圖可知LED電路是共陽極的(即各IO口輸出低電平0才會點亮)<br /> //這裡初始化為1,不讓LED點亮<br /> s3c2410_gpio_setpin(led_table[i], ~(LED_OFF));<br /> }</p><p> //註冊LED裝置為字元裝置<br /> ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &leds_fops);</p><p> if(ret < 0)<br /> {<br /> printk(DEVICE_NAME " register falid!/n");<br /> return ret;<br /> }<br />}</p><p>static void __exit led_exit(void)<br />{<br /> //登出裝置<br /> unregister_chrdev(LED_MAJOR, DEVICE_NAME);<br />}</p><p>module_init(led_init);<br />module_exit(led_exit);</p><p>MODULE_LICENSE("GPL");<br />MODULE_AUTHOR("Huang Gang");<br />MODULE_DESCRIPTION("My2440 led driver");<br />

 

4. 把LED驅動代碼部署到核心中去

 

#cp -f my2440_leds.c /linux-2.6.30.4/drivers/char //把驅動源碼複製到核心驅動的字元裝置下<br />

 

#gedit /linux-2.6.30.4/drivers/char/Kconfig //添加LED裝置配置</p><p>config MY2440_LEDS<br /> tristate "My2440 Leds Device"<br /> depends on ARCH_S3C2440<br /> default y<br /> ---help---<br /> My2440 User Leds</p><p>

 

#gedit /linux-2.6.30.4/drivers/char/Makefile //添加LED裝置配置</p><p>obj-$(CONFIG_MY2440_LEDS) += my2440_leds.o</p><p>

 

5. 配置核心,選擇LED裝置選項

 

#make menuconfig</p><p>Device Drivers ---><br /> Character devices ---><br /> <*> My2440 Leds Device (NEW)</p><p>

 

6. 編譯核心並下載到開發板上,查看已載入的裝置:#cat /proc/devices,可以看到my2440_leds的主裝置號為231

 

 

7. 編寫應用程式測試LED驅動,檔案名稱:leds_test.c

 

/*<br /> ==============================================<br /> Name : leds_test.c<br /> Author : Huang Gang<br /> Date : 06/11/2009<br /> Copyright : GPL<br /> Description : my2440 leds driver test<br /> ==============================================<br /> */</p><p>#include <stdio.h><br />#include <stdlib.h><br />#include <fcntl.h><br />#include <sys/ioctl.h></p><p>int main(int argc, char **argv)<br />{<br /> int turn, index, fd;</p><p> //檢測輸入的參數合法性<br /> if(argc != 3 || sscanf(argv[2], "%d", &index) != 1 || index < 1 || index > 4)<br /> {<br /> printf("Usage: leds_test on|off 1|2|3|4/n");<br /> exit(1);<br /> }</p><p> if(strcmp(argv[1], "on") == 0)<br /> {<br /> turn = 1;<br /> }<br /> else if(strcmp(argv[1], "off") == 0)<br /> {<br /> turn = 0;<br /> }<br /> else<br /> {<br /> printf("Usage: leds_test on|off 1|2|3|4/n");<br /> exit(1);<br /> }</p><p> //開啟LED裝置<br /> fd = open("/dev/my2440_leds", 0);</p><p> if(fd < 0)<br /> {<br /> printf("Open Led Device Faild!/n");<br /> exit(1);<br /> }</p><p> //IO控制<br /> ioctl(fd, turn, index - 1);</p><p> //關閉LED裝置<br /> close(fd);</p><p> return 0;<br />}<br />

 

8. 在開發主機上交叉編譯測試應用程式,並複製到檔案系統的/usr/sbin目錄下,然後重新編譯檔案系統下載到開發板上

 

#arm-linux-gcc -o leds_test leds_test.c<br />

 

9. 在開發板上的檔案系統中建立一個LED裝置的節點,然後運行測試程式,如下,觀測開發板上的LED燈,可以看到每一步的操作對應的LED會點亮或者熄滅

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.