在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux之我行——LED驅(qū)動(dòng)在2440上的實(shí)例開發(fā)

            嵌入式Linux之我行——LED驅(qū)動(dòng)在2440上的實(shí)例開發(fā)

            作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
            一、開發(fā)環(huán)境
            • 機(jī):VMWare--Fedora 9
            • 開發(fā)板:Mini2440--64MB Nand
            • 編譯器:arm-linux-gcc-4.3.2

            二、實(shí)現(xiàn)步驟

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

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

            2. 去掉內(nèi)核已有的LED驅(qū)動(dòng)設(shè)置,因?yàn)镮O口與mini2440開發(fā)板的不一致,根本就不能控制板上的LED。

            #gedit arch/arm/plat-s3c24xx/common-smdk.c //注釋掉以下內(nèi)容


            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開發(fā)板的LED驅(qū)動(dòng),代碼如下,文件名稱:my2440_leds.c



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

            #defineDEVICE_NAME"my2440_leds"//設(shè)備名稱
            #defineLED_MAJOR231//主設(shè)備號(hào)
            #defineLED_ON1//LED亮狀態(tài)
            #defineLED_OFF0//LED滅狀態(tài)

            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)
            {
            //檢測是第幾個(gè)LED,因開發(fā)板上只有4個(gè),索引從0開始
            if(arg<0||arg>3)
            {
            return-EINVAL;
            }

            //判斷LED要執(zhí)行哪種狀態(tài)
            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才會(huì)點(diǎn)亮)
            //這里初始化為1,不讓LED點(diǎn)亮
            s3c2410_gpio_setpin(led_table[i],~(LED_OFF));
            }

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

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

            staticvoid__exit led_exit(void)
            {
            //注銷設(shè)備
            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驅(qū)動(dòng)代碼部署到內(nèi)核中去

            #cp -f my2440_leds.c /linux-2.6.30.4/drivers/char //把驅(qū)動(dòng)源碼復(fù)制到內(nèi)核驅(qū)動(dòng)的字符設(shè)備下


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

            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設(shè)備配置

            obj-$(CONFIG_MY2440_LEDS)+= my2440_leds.o

            5. 配置內(nèi)核,選擇LED設(shè)備選項(xiàng)

            #make menuconfig

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


            6. 編譯內(nèi)核并下載到開發(fā)板上,查看已加載的設(shè)備:#cat /proc/devices,可以看到my2440_leds的主設(shè)備號(hào)為231

            7. 編寫應(yīng)用程序測試LED驅(qū)動(dòng),文件名:leds_test.c



            #include
            #include
            #include
            #include

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

            //檢測輸入的參數(shù)合法性
            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設(shè)備
            fd=open("/dev/my2440_leds",0);

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

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

            //關(guān)閉LED設(shè)備
            close(fd);

            return0;
            }


            8. 在開發(fā)主機(jī)上交叉編譯測試應(yīng)用程序,并復(fù)制到文件系統(tǒng)的/usr/sbin目錄下,然后重新編譯文件系統(tǒng)下載到開發(fā)板上

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


            9. 在開發(fā)板上的文件系統(tǒng)中創(chuàng)建一個(gè)LED設(shè)備的節(jié)點(diǎn),然后運(yùn)行測試程序,效果圖如下,觀測開發(fā)板上的LED燈,可以看到每一步的操作對應(yīng)的LED會(huì)點(diǎn)亮或者熄滅



            關(guān)鍵詞: LinuxLED驅(qū)動(dòng)244

            評論


            技術(shù)專區(qū)

            關(guān)閉