新聞中心

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

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

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

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

        本文引用地址:http://www.104case.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; //初始化按鍵狀態為抬起狀態

          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

          執行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) {//主循環

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

          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目錄下會生成目標機的可執行文件led_button。

          (7)運行測試程序

          創建設備

          在目標機中,通過查看/proc/devices中注冊進內核的設備條目及相關的設備號。進入/dev目錄,創建設備,設備名為led,屬于字符型設備,主設備號是212,次設備號是0;創建設備,設備名為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 按鍵中斷

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 龙陵县| 大兴区| 克什克腾旗| 富平县| 东乡县| 莱州市| 乳山市| 辰溪县| 华容县| 进贤县| 仁寿县| 无棣县| 柏乡县| 加查县| 霍邱县| 抚宁县| 湖南省| 射阳县| 乌拉特前旗| 客服| 察隅县| 泰安市| 建德市| 微山县| 泸水县| 洮南市| 青岛市| 元阳县| 图木舒克市| 宁海县| 英德市| 澄江县| 永兴县| 吴川市| 雷州市| 射阳县| 察哈| 和政县| 布尔津县| 广安市| 东至县|