微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LED驱动的简单功能实现

LED驱动的简单功能实现

时间:10-02 整理:3721RD 点击:

调试了好几天的GPIO驱动,发现无法申请动态的驱动,只能用光盘自带的程序加以修改来实现以前我实现过的功能了。
驱动分为三个部分:驱动程序、Makefile、应用程序。
驱动程序的编译需要在Linux环境下进行编译,之后将生成的.ko文件通过NFS服务拷贝至开发板,安装驱动即可使用。
驱动程序:

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/types.h>
  4. #include <linux/sched.h>
  5. #include <linux/init.h>
  6. #include <linux/fs.h>
  7. #include <linux/ioctl.h>
  8. #include <linux/delay.h>
  9. #include <linux/bcd.h>
  10. #include <linux/capability.h>
  11. #include <linux/rtc.h>
  12. #include <linux/cdev.h>
  13. #include <linux/miscdevice.h>
  14. #include <linux/gpio.h>

  15. #include <../arch/arm/mach-mx28/mx28_pins.h>

  16. #define DEVICE_NAME "imx28x_led"

  17. #define LED_GPIO MXS_PIN_TO_GPIO(PINID_SAIF0_MCLK)
  18. #define LED_GPIO1 MXS_PIN_TO_GPIO(PINID_SSP0_DATA7)


  19. static int gpio_open(struct inode *inode, struct file *filp)
  20. {
  21.         gpio_request(LED_GPIO, "led");
  22.         gpio_request(LED_GPIO1, "led1");
  23.         return 0;
  24. }

  25. static int gpio_release(struct inode *inode, struct file *filp)
  26. {
  27.         gpio_free(LED_GPIO);
  28.         gpio_free(LED_GPIO1);
  29.         return 0;
  30. }


  31. static int gpio_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg)
  32. {

  33.         switch (command){
  34.         case 0:
  35.         switch (arg) {
  36.         case 0:
  37.         gpio_direction_output(LED_GPIO, 0);
  38.         break;

  39.         case 1:
  40.         gpio_direction_output(LED_GPIO, 1);
  41.         break;
  42.         }
  43.         break;
  44.         case 1:
  45.         switch (arg) {
  46.         case 0:
  47.         gpio_direction_output(LED_GPIO1, 0);
  48.         break;

  49.         case 1:
  50.         gpio_direction_output(LED_GPIO1, 1);
  51.         break;
  52.         }
  53.         break;
  54.         }
  55.         return 0;
  56. }

  57. static struct file_operations gpio_fops={
  58.         .owner = THIS_MODULE,
  59.         .open = gpio_open,
  60.         .write = gpio_write,
  61.         .release = gpio_release,
  62.         .ioctl = gpio_ioctl,
  63. };

  64. static struct miscdevice gpio_miscdev = {
  65.         .minor = MISC_DYNAMIC_MINOR,
  66.         .name = DEVICE_NAME,
  67. .fops = &gpio_fops,
  68. };

  69. static int __init gpio_init(void)
  70. {

  71.         misc_register(&gpio_miscdev);
  72.         printk(DEVICE_NAME" up. \n");

  73.         return 0;
  74. }

  75. static void __exit gpio_exit(void)
  76. {
  77.         misc_deregister(&gpio_miscdev);
  78.         printk(DEVICE_NAME " down.\n");
  79. }

  80. module_init(gpio_init);
  81. module_exit(gpio_exit);

  82. MODULE_LICENSE("Dual BSD/GPL");
  83. MODULE_AUTHOR("zhuguojun, ZhiYuan Electronics Co, Ltd.");
  84. MODULE_DESCRIPTION("GPIO DRIVER FOR EasyARM-i.MX28xx");

复制代码


Makefile:

  1. ARCH=arm
  2. CROSS_COMPILE=/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-
  3. obj-m := led.o
  4. KDIR := /usr/linux-2.6.35.3
  5. PWD := $(shell pwd)
  6. default:
  7.         make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
  8. clean:                                                                                                                                                    clean:
  9.         $(MAKE) -C $(KDIR) M=$(PWD) clean

复制代码


应用程序:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <termios.h>
  8. #include <errno.h>
  9. #include <limits.h>
  10. #include <asm/ioctls.h>
  11. #include <time.h>
  12. #include <pthread.h>


  13. int main(int argc, char **argv)
  14. {
  15.         int fd;
  16.         int a,b;

  17.         fd = open("/dev/imx28x_led", O_RDWR);
  18.         if (fd < 0) {
  19.                 perror("open /dev/imx28x_led");
  20.         }

  21.         a = atoi(argv[1]);   
  22.         b = atoi(argv[2]);
  23.         ioctl(fd,a,b);
  24.         return 0;
  25. }

复制代码


下面是实物图:




Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top