新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > [ARM应用]按键中断驱动实例

[ARM应用]按键中断驱动实例

作者: 时间:2016-12-02 来源:网络 收藏

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

本文引用地址:https://www.eepw.com.cn/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 按键中断

评论


相关推荐

技术专区

关闭