<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > [ARM應用]按鍵中斷驅動實例

          [ARM應用]按鍵中斷驅動實例

          作者: 時間:2016-12-02 來源:網絡 收藏

            ****************************s3c2410_button_init()************************

          本文引用地址:http://www.ex-cimer.com/article/201612/341050.htm

            *描述 :模塊加載,IO及相關變量初始化

            *參數 :無

            *返回值:無

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

            */

            static int s3c2410_button_init(void)

            {

            int result;

            set_irq_type(BUTTON_IRQ,IRQT_FALLING); //設置外部中斷0為下降沿中斷

            dev_t devno = MKDEV(button_major,0);

            if(button_major)

            result = register_chrdev_region(devno,1,DEVICE_NAME);

            else{

            result = alloc_chrdev_region(&devno ,0 ,1,DEVICE_NAME);

            button_major = MAJOR(devno);

            }

            if(result < 0)return result;

            button_setup_cdev();

            s3c2410_button_InitIO(); //初始化IO端口

            dev.status = BUTTON_UP; //初始化按鍵狀態(tài)為抬起狀態(tài)

            printk(DEVICE_NAME " initializedn");

            return 0;

            }

            /*

            ****************************s3c2410_button_exit()************************

            *描述 :模塊卸載

            *參數 :無

            *返回值:無

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

            */

            static void s3c2410_button_exit(void)

            {

            cdev_del(&dev.cdev); //注銷設備

            unregister_chrdev_region(MKDEV(button_major,0),1); //釋放設備號

            }

            module_init(s3c2410_button_init);

            module_exit(s3c2410_button_exit);

            MODULE_LICENSE("GPL");

            (2)編寫Makefile文件(主機的/home/kernel/rootfs/rootfs/usr/button/driver目錄下)

            vi Makefile

            在該文件中加入以下內容:

            #如果已定義KERNELRELEASE,則說明是從內核構造系統調用的,

            #因此可利用其內建語句。

            ifneq ($(KERNELRELEASE),)

            obj-m := button.o

            #要構建的模塊名稱為button.ko,

            #并由兩個源文件生成(比如file1.c和file2.c)

            #module-objs := file1.o file2.o

            #否則,是直接從命令行調用的,

            #這時要調用內核構造系統。

            else

            KERNELDIR := /home/kernel/linux-2.6.24.4

            PWD := $(shell pwd)

            default:

            $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

            endif

            clean:

            rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers

            (3)編譯

            make

            執(zhí)行make命令進行編譯,編譯完成后,該目錄下有一些文件,其中button.ko就是編譯成功的模塊文件。

            (4)加載模塊

            首先設置內核以NFS方式加載根文件系統,在宿主機上運行minicom,加載完U-Boot,內核和nfs文件系統之后按回車鍵進入目標機shell控制臺,在目標機控制臺中輸入模塊加載命令:

            insmod usr/led/driver/led.ko

            insmod usr/button/driver/button.ko

            如果輸出“button initialized”,表示button設備驅動加載成功

            (5)編寫測試文件button_led.c(該測試程序還依賴LED的驅動)

            進入宿主機的/home/kernel/rootfs/rootfs/usr/button/test目錄。

            cd /home/kernel/rootfs/rootfs/usr/button/test

            vi button_led.c

            驅動測試文件button_led.c如下所示:

            #include

            #include

            #include

            #include

            #include

            #include

            #define UP 0

            #define DOWN 1

            #define X 2

            #define LED_ON 0

            #define LED_OFF 1

            int main()

            {

            int fd0,fd1,i,j;

            int ret= 0;

            int button_status;

            fd0 = open("/dev/button",O_RDWR);//打開button設備fd0

            if (fd0 == -1) {//打開fd0設備失敗

            printf("open device button errr!n");

            return 0;

            }

            fd1 = open("/dev/led",O_RDWR);//打開led設備fd1

            if (fd1 == -1) {//打開fd1設備失敗

            printf("open device led errr!n");

            return 0;

            }

            ioctl(fd1,LED_OFF); //先熄滅D1

            printf("button test show. press ctrl+c to exit n");

            while(1) {//主循環(huán)

            read(fd0,&button_status,1);//讀取按鍵的狀態(tài),看是否被按下

            if(button_status == DOWN){//如果按鍵按下了

            ioctl(fd1,LED_ON); //點亮D1

            for(i=0;i<300;i++)

            for(j=0;j<5000;j++);//延時一段時間

            ioctl(fd1,LED_OFF); //熄滅D1

            }

            for(i=0;i<300;i++)

            for(j=0;j<5000;j++);

            }

            close(fd0);//關閉fd0設備

            close(fd1);//關閉fd1設備

            return 0;

            }

            (6)編譯測試程序

            arm-linux-gcc -o led_button led_button.c

            該命令的意思是使用的交叉編譯器arm-linux-gcc對測試程序led_button.c進行編譯,編譯成功后在test目錄下會生成目標機的可執(zhí)行文件led_button。

            (7)運行測試程序

            創(chuàng)建設備

            在目標機中,通過查看/proc/devices中注冊進內核的設備條目及相關的設備號。進入/dev目錄,創(chuàng)建設備,設備名為led,屬于字符型設備,主設備號是212,次設備號是0;創(chuàng)建設備,設備名為button,屬于字符型設備,主設備號是213,次設備號是0。(要與led.c和button.c文件中的定義相符):

            cat /proc/devices

            cd /dev

            mknod led c 212 0

            mknod button c 213 0

            ./usr/button/test/led_button或/usr/led/test/led_button

            (10)卸載模塊

            rmmod /dev/button

            rmmod /dev/led

            From:嵌入式Linux初級實驗


          上一頁 1 2 下一頁

          關鍵詞: ARM 按鍵中斷

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();