日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux3.0-内核自带led驱动移植

發布時間:2023/12/10 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux3.0-内核自带led驱动移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

**********************************************************************************************************************************************************************************

cpu ? ? ? ? ?: s3c2440(arm9)

linux內核:linux-3.0

開發板 ? ? :fl2440

開發模塊 :LED

************************************************************************************************************************************************************************************

前言:之前為了學習了解驅動的寫法,所以編寫與測試過led驅動,然而linux3.0的內核已經有了這個led驅動,所以我們只需要使能移植到我們的fl2440開發板上即可

1.源碼修改

查看fl2440開發板原理圖,可知4個led分別是連接GPB5,GPB6.GPB8.GPB10這四個管腳,如圖所示:

?

所以我們需要在arch/arm/plat-s3c24xx/common-smdk.c文件中稍作修改,將led0~led3的相關GPIO分別配置成PB5,PB6,PB8,PB10

[zoulei@CentOS linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c

?

  • 48

  • 49 /* LED devices */

  • 50

  • 51 static struct s3c24xx_led_platdata smdk_pdata_led1 = {

  • 52 .gpio = S3C2410_GPB(5),

  • 53 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

  • 54 .name = "led1",

  • 55 .def_trigger = "timer",

  • 56 };

  • 57

  • 58 static struct s3c24xx_led_platdata smdk_pdata_led2 = {

  • 59 .gpio = S3C2410_GPB(6),

  • 60 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

  • 61 .name = "led2",

  • 62 .def_trigger = "nand-disk",

  • 63 };

  • 64

  • 65 static struct s3c24xx_led_platdata smdk_pdata_led3 = {

  • 66 .gpio = S3C2410_GPB(8),

  • 67 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

  • 68 .name = "led3",

  • 69 };

  • 70

  • 71 static struct s3c24xx_led_platdata smdk_pdata_led4 = {

  • 72 .gpio = S3C2410_GPB(10),

  • 73 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

  • 74 .name = "led4",

  • 75 };

  • 177

  • 178 void __init smdk_machine_init(void)

  • 179 {

  • 180 /* Configure the LEDs (even if we have no LED support)*/

  • 181

  • 182 s3c_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT);

  • 183 s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);

  • 184 s3c_gpio_cfgpin(S3C2410_GPB(8), S3C2410_GPIO_OUTPUT);

  • 185 s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_OUTPUT);

  • 186

  • 187 s3c2410_gpio_setpin(S3C2410_GPB(5), 1);

  • 188 s3c2410_gpio_setpin(S3C2410_GPB(6), 1);

  • 189 s3c2410_gpio_setpin(S3C2410_GPB(8), 1);

  • 190 s3c2410_gpio_setpin(S3C2410_GPB(10), 1);


  • 2.make menuconfig配置

    [zoulei@CentOS linux-3.0]$ make menuconfig

    ?

  • Device drivers-->

  • [*]LED support-->

  • [*]LED Class support

  • <*>LED Support for Samsung S3C24XX GPIO LEDs /*添加led支持*/


  • 完成上面的操作之后重新編譯內核然后燒錄到開發板,運行

    3.下載到開發板測試

    下載到內核之后會在/sys/class/目錄下生成leds目錄,在leds目錄下會看到led0 led1 led2 led3四個LED的目錄,這就是開發板上的四個LED.

    查看其中一個LED設備,如led1,可以看出led1當前的狀態是關閉。其中brightness就是控制等亮滅的文件,(0表示關閉,1表示打開)

    max_brightness可以控制亮滅程度的最大值假如設定是50就是0到50代表不同的亮度

    向brightness寫1,表示打開LED。這時led1會被點亮。

    向brightness寫0,表示關閉LED。這時led1會被熄滅。

    其他led也是同樣的操作!

    **************************************************************************************************************************************************************************************

    說明:對于向led這樣的設備模型,系統認為所有的設備都是掛接在總線上的,而要使設備工作,就需要相應的驅動。設備模型會產生一個虛擬的文件系統——sysfs,它給用戶提供了一個從用戶空間去訪問內核設備的方法,它在Linux里的路徑是/sys。如果要寫程序訪問sysfs,可以像讀寫普通文件一樣來操作/sys目錄下的文件

    ***********************************************************************************************************************************************

    代碼測試:

    ?

  • led.c

  • /*********************************************************************************

  • * Copyright: (C) 2017 zoulei

  • * All rights reserved.

  • *

  • * Filename: led.c

  • * Description: This file

  • *

  • * Version: 1.0.0(2017年04月20日)

  • * Author: zoulei <zoulei121@gmail.com>

  • * ChangeLog: 1, Release initial version on "2017年04月20日 06時19分52秒"

  • *

  • ********************************************************************************/

  • #include<stdint.h>

  • #include<string.h>

  • #include<fcntl.h>

  • #include<unistd.h>

  • #include<stdio.h>

  • #include<linux/input.h>

  • #include<unistd.h>

  • ?
  • int main(int argc, char *argv[])

  • {

  • int fd, no;

  • no=(int)argv[1][3]-48; /*這么做的目的是得到運行./led_test led1(led2,led3,led4)on 命令時中的第二個參數中的數字1,2,3,4*/

  • switch(no)

  • {

  • case 1:

  • fd = open("/sys/class/leds/led1/brightness", O_RDWR);

  • break;

  • case 2:

  • fd = open("/sys/class/leds/led2/brightness", O_RDWR);

  • break;

  • case 3:

  • fd = open("/sys/class/leds/led3/brightness", O_RDWR);

  • break;

  • case 4:

  • fd = open("/sys/class/leds/led4/brightness", O_RDWR);

  • break;

  • default:

  • return -1;

  • }

  • if(fd<0)

  • {

  • printf("can not open file.\n");

  • return -1;

  • }

  • ?
  • /*完成打開或關閉LED操作*/

  • if(!strcmp(argv[2],"on"))

  • write(fd, "1", 1);

  • else if(!strcmp(argv[2],"off"))

  • write(fd, "0", 1);

  • ?
  • close(fd);

  • return 0;

  • }


  • 將用交叉編譯器編譯之后下載到開發板上運行,

    測試結果為:

    四個led燈成功點亮與熄滅。led驅動移植成功!

    總結

    以上是生活随笔為你收集整理的linux3.0-内核自带led驱动移植的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。