新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux之我行——LED驅動在2440上的實例開發

        嵌入式Linux之我行——LED驅動在2440上的實例開發

        作者: 時間:2016-11-20 來源:網絡 收藏
        一、開發環境
        • 機:VMWare--Fedora 9
        • 開發板:Mini2440--64MB Nand
        • 編譯器:arm-linux-gcc-4.3.2

        二、實現步驟

        本文引用地址:http://www.104case.com/article/201611/319004.htm

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

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

        #gedit arch/arm/plat-s3c24xx/common-smdk.c //注釋掉以下內容


        staticstructplatform_device __initdata*smdk_devs[]={
        &s3c_device_nand,

        };


        void__init smdk_machine_init(void)
        {



        if(machine_is_smdk2443())
        smdk_nand_info.twrph0=50;

        s3c_device_nand.dev.platform_data=&smdk_nand_info;

        platform_add_devices(smdk_devs,ARRAY_SIZE(smdk_devs));

        s3c_pm_init();
        }


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



        #include
        #include
        #include
        #include
        #include
        #include
        #include

        #defineDEVICE_NAME"my2440_leds"//設備名稱
        #defineLED_MAJOR231//主設備號
        #defineLED_ON1//LED亮狀態
        #defineLED_OFF0//LED滅狀態

        staticunsignedlongled_table[]=//控制LED的IO口
        {
        S3C2410_GPB5,
        S3C2410_GPB6,
        S3C2410_GPB7,
        S3C2410_GPB8,
        };

        staticunsignedintled_cfg_table[]=//LED IO口的模式
        {
        S3C2410_GPB5_OUTP,
        S3C2410_GPB6_OUTP,
        S3C2410_GPB7_OUTP,
        S3C2410_GPB8_OUTP,
        };

        staticintleds_open(structinode*inode,structfile*file)
        {
        return0;
        }

        staticintleds_ioctl(structinode*inode,structfile*file,
        unsignedintcmd,unsignedlongarg)
        {
        //檢測是第幾個LED,因開發板上只有4個,索引從0開始
        if(arg<0||arg>3)
        {
        return-EINVAL;
        }

        //判斷LED要執行哪種狀態
        switch(cmd)
        {
        caseLED_ON:
        {
        s3c2410_gpio_setpin(led_table[arg],~(LED_ON));
        break;
        }
        caseLED_OFF:
        {
        s3c2410_gpio_setpin(led_table[arg],~(LED_OFF));
        break;
        }
        default:
        {
        return-EINVAL;
        }
        }

        return0;
        }

        staticstructfile_operations leds_fops=
        {
        .owner=THIS_MODULE,
        .open=leds_open,
        .ioctl=leds_ioctl,
        };

        staticint__init led_init(void)
        {
        intret,i;

        for(i=0;i<4;i++)
        {
        //初始化各IO口為輸出模式
        s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);

        //由原理圖可知LED電路是共陽極的(即各IO口輸出低電平0才會點亮)
        //這里初始化為1,不讓LED點亮
        s3c2410_gpio_setpin(led_table[i],~(LED_OFF));
        }

        //注冊LED設備為字符設備
        ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&leds_fops);

        if(ret<0)
        {
        printk(DEVICE_NAME" register falid!n");
        returnret;
        }
        }

        staticvoid__exit led_exit(void)
        {
        //注銷設備
        unregister_chrdev(LED_MAJOR,DEVICE_NAME);
        }

        module_init(led_init);
        module_exit(led_exit);

        MODULE_LICENSE("GPL");
        MODULE_AUTHOR("Huang Gang");
        MODULE_DESCRIPTION("My2440 led driver");


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

        #cp -f my2440_leds.c /linux-2.6.30.4/drivers/char //把驅動源碼復制到內核驅動的字符設備下


        #gedit /linux-2.6.30.4/drivers/char/Kconfig //添加LED設備配置

        config MY2440_LEDS
        tristate "My2440 Leds Device"
        depends on ARCH_S3C2440
        default y
        ---help---
        My2440 User Leds

        #gedit /linux-2.6.30.4/drivers/char/Makefile //添加LED設備配置

        obj-$(CONFIG_MY2440_LEDS)+= my2440_leds.o

        5. 配置內核,選擇LED設備選項

        #make menuconfig

        Device Drivers --->
        Character devices --->
        <*>My2440 Leds Device (NEW)


        6. 編譯內核并下載到開發板上,查看已加載的設備:#cat /proc/devices,可以看到my2440_leds的主設備號為231

        7. 編寫應用程序測試LED驅動,文件名:leds_test.c



        #include
        #include
        #include
        #include

        intmain(intargc,char**argv)
        {
        intturn,index,fd;

        //檢測輸入的參數合法性
        if(argc!=3||sscanf(argv[2],"%d",&index)!=1||index<1||index>4)
        {
        printf("Usage: leds_test on|off 1|2|3|4n");
        exit(1);
        }

        if(strcmp(argv[1],"on")==0)
        {
        turn=1;
        }
        elseif(strcmp(argv[1],"off")==0)
        {
        turn=0;
        }
        else
        {
        printf("Usage: leds_test on|off 1|2|3|4n");
        exit(1);
        }

        //打開LED設備
        fd=open("/dev/my2440_leds",0);

        if(fd<0)
        {
        printf("Open Led Device Faild!n");
        exit(1);
        }

        //IO控制
        ioctl(fd,turn,index-1);

        //關閉LED設備
        close(fd);

        return0;
        }


        8. 在開發主機上交叉編譯測試應用程序,并復制到文件系統的/usr/sbin目錄下,然后重新編譯文件系統下載到開發板上

        #arm-linux-gcc -o leds_test leds_test.c


        9. 在開發板上的文件系統中創建一個LED設備的節點,然后運行測試程序,效果圖如下,觀測開發板上的LED燈,可以看到每一步的操作對應的LED會點亮或者熄滅



        關鍵詞: LinuxLED驅動244

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 玉林市| 临汾市| 巴中市| 绥化市| 南岸区| 临沂市| 南木林县| 南乐县| 会理县| 长白| 麻阳| 清苑县| 曲阳县| 崇文区| 保定市| 高碑店市| 延安市| 昭通市| 扶沟县| 蒲江县| 巴中市| 延寿县| 湘西| 广昌县| 固安县| 舟曲县| 老河口市| 清水河县| 剑川县| 汪清县| 墨脱县| 姜堰市| 德钦县| 通榆县| 乌恰县| 宽城| 新民市| 高青县| 张家界市| 裕民县| 图片|