驱动程序开发--AT91SAM9260的GPIO驱动笔记

驱动学习,字符驱动例程。在AT91SAM9260开发板上的驱动开发

1 驱动编写

  1. #include <linux/init.h>  
  2. #include <linux/dma-mapping.h>  
  3. #include <linux/module.h>  
  4. #include <linux/sched.h>  
  5. #include <linux/completion.h>  
  6. #include <linux/interrupt.h>  
  7. #include <linux/clk.h>  
  8. #include <linux/platform_device.h>  
  9. #include <linux/atmel_pdc.h>  
  10. #include <asm/io.h>  
  11. #include <asm/system.h>  
  12. #include <asm/uaccess.h>  
  13. #include <linux/semaphore.h>  
  14. #include <linux/kernel.h>  
  15. #include <linux/cdev.h>  
  16. #include <linux/types.h>  
  17. #include <linux/fs.h>  
  18. #include <linux/input.h>  
  19. #include <linux/errno.h>  
  20. #include <linux/irq.h>  
  21. #include <linux/debugfs.h>  
  22. #include <linux/seq_file.h>  
  23. #include <linux/list.h>  
  24.   
  25. #include <mach/board.h>  
  26. #include <mach/gpio.h>  
  27. #include <mach/irqs.h>  
  28. #include <mach/hardware.h>  
  29. #include <mach/at91_pio.h>  
  30.   
  31. #define MY_LED_MAJOR    250  
  32.   
  33. #define LED_ON      0  
  34. #define LED_OFF     1  
  35.   
  36. struct global_dev{  
  37.     struct cdev cdev;  
  38. };  
  39. struct global_dev *global_devp;  
  40.   
  41. static int led_open(struct inode *inode, struct file *filp)  
  42. {  
  43.     filp->private_data = global_devp;  
  44.     return 0;  
  45. }  
  46.   
  47. static int led_release(struct inode *inode, struct file *file)  
  48. {  
  49.     return 0;  
  50. }  
  51.   
  52. static int led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data)  
  53. {  
  54.     switch(cmd)  
  55.     {  
  56.         case LED_ON:  
  57.             at91_set_gpio_value(AT91_PIN_PA29, 0);  
  58.             break;  
  59.         case LED_OFF:  
  60.             at91_set_gpio_value(AT91_PIN_PA29, 1);  
  61.             break;  
  62.         default:  
  63.             printk("no valid cmd input!\n");  
  64.             break;  
  65.     }  
  66.     return 0;  
  67. }  
  68.   
  69. struct file_operations my_led_ctl_ops ={  
  70.     .owner = THIS_MODULE,  
  71.     .open = led_open,  
  72.     .release = led_release,  
  73.     .ioctl = led_ioctl,  
  74. };  
  75.   
  76. static void led_setup(struct global_dev *dev, int index)  
  77. {  
  78.     int err;  
  79.     int devno = MKDEV(MY_LED_MAJOR, index);  
  80.     cdev_init(&dev->cdev, &my_led_ctl_ops);  
  81.     dev->cdev.owner = THIS_MODULE;  
  82.     dev->cdev.ops = &my_led_ctl_ops;  
  83.     err = cdev_add(&dev->cdev, devno, 1);  
  84.     if(err)  
  85.         printk("add my led setup failed!\n");  
  86. }  
  87.   
  88. static int led_init(void)  
  89. {  
  90.     int ret;  
  91.     dev_t devno = MKDEV(MY_LED_MAJOR, 0);  
  92.     printk("my first driver--led!\n");  
  93.       
  94.     at91_set_GPIO_periph(AT91_PIN_PA29, 1);  
  95.     at91_set_gpio_output(AT91_PIN_PA29, 1);  
  96.       
  97.     ret = register_chrdev_region(devno, 1, "my_led");  
  98.     if( ret < 0) {  
  99.         printk("my_led init_module failed with %d\n", ret);  
  100.         return ret;  
  101.     }  
  102.     else  
  103.         printk("my_led init_module success!\n");  
  104.   
  105.   
  106.     global_devp = kmalloc(sizeof(struct global_dev), GFP_KERNEL);  
  107.   
  108.     memset(global_devp, 0, sizeof(struct global_dev));  
  109.   
  110.     led_setup(global_devp, 0);  
  111.   
  112.     return ret;  
  113. }  
  114. static void led_exit(void)  
  115. {  
  116.     cdev_del(&global_devp->cdev);  
  117.     kfree(global_devp);  
  118.     unregister_chrdev_region(MKDEV(MY_LED_MAJOR, 0), 1);  
  119. }  
  120.   
  121.   
  122. MODULE_LICENSE("MYGPL");  
  123. MODULE_AUTHOR("WHF");  
  124.   
  125.   
  126. module_init(led_init);  
  127. module_exit(led_exit);</span>  
2 驱动程序部分编写完毕后,就是在内核中添加相应的驱动配置点击打开链接 ,并进行编译,下载

3 添加完毕后,编写相应的测试程序

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <fcntl.h>  
  5. #include <unistd.h>  
  6.   
  7. #define DEVICE_NAME "/dev/leds"  
  8. #define LED_ON  0  
  9. #define LED_OFF 1  
  10.   
  11. int main(void)  
  12. {  
  13.     int fd;  
  14.     int ret;  
  15.     int i;  
  16.     printf("led_driver test!\n");  
  17.   
  18.     fd = open(DEVICE_NAME, O_RDONLY);  
  19.     if(fd == -1)  
  20.         printf("open device %s error!\n", DEVICE_NAME);  
  21.   
  22.     printf("fd = %d\n", fd);  
  23.     for(i = 0; i < 50; i++)  
  24.     {  
  25.         ioctl(fd, LED_OFF);  
  26.         sleep(1);  
  27.         ioctl(fd, LED_ON);  
  28.         sleep(1);  
  29.     }  
  30.   
  31.     ret = close(fd);  
  32.     printf("ret = %d\n", ret);  
  33.     printf("Close led_driver!\n");  
  34.     return 0;  
  35. }  
4编写Makefile文件

[html]  view plain copy print ?
  1. ARCH=arm  
  2. CROSS_COMPILE=arm-none-linux-gnueabi-  
  3.   
  4. all:leds  
  5.     $(CROSS_COMPILE)gcc -o leds leds.c  
  6.     $(CROSS_COMPILE)strip leds  
  7. clean:  
  8.     @rm -vf leds *.o *~  
5 编译生成可执行文件

以上是在网络资料的基础是对简单驱动开发的笔记整理,中在学习驱动的基本框架。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值