<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > [ARM應用]按鍵中斷驅動(dòng)實(shí)例

[ARM應用]按鍵中斷驅動(dòng)實(shí)例

作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/201612/341050.htm

  *描述 :模塊加載,IO及相關(guān)變量初始化

  *參數 :無(wú)

  *返回值:無(wú)

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

  */

  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()************************

  *描述 :模塊卸載

  *參數 :無(wú)

  *返回值:無(wú)

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

  */

  static void s3c2410_button_exit(void)

  {

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

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

  }

  module_init(s3c2410_button_init);

  module_exit(s3c2410_button_exit);

  MODULE_LICENSE("GPL");

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

  vi Makefile

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

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

  #因此可利用其內建語(yǔ)句。

  ifneq ($(KERNELRELEASE),)

  obj-m := button.o

  #要構建的模塊名稱(chēng)為button.ko,

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

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

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

  #這時(shí)要調用內核構造系統。

  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命令進(jìn)行編譯,編譯完成后,該目錄下有一些文件,其中button.ko就是編譯成功的模塊文件。

  (4)加載模塊

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

  insmod usr/led/driver/led.ko

  insmod usr/button/driver/button.ko

  如果輸出“button initialized”,表示button設備驅動(dòng)加載成功

  (5)編寫(xiě)測試文件button_led.c(該測試程序還依賴(lài)LED的驅動(dòng))

  進(jìn)入宿主機的/home/kernel/rootfs/rootfs/usr/button/test目錄。

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

  vi button_led.c

  驅動(dòng)測試文件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);//打開(kāi)button設備fd0

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

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

  return 0;

  }

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

  if (fd1 == -1) {//打開(kāi)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); //點(diǎn)亮D1

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

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

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

  }

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

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

  }

  close(fd0);//關(guān)閉fd0設備

  close(fd1);//關(guān)閉fd1設備

  return 0;

  }

  (6)編譯測試程序

  arm-linux-gcc -o led_button led_button.c

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

  (7)運行測試程序

  創(chuàng )建設備

  在目標機中,通過(guò)查看/proc/devices中注冊進(jìn)內核的設備條目及相關(guān)的設備號。進(jìn)入/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初級實(shí)驗


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: ARM 按鍵中斷

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>