Chinaunix首页 | 论坛 | 博客
  • 博客访问: 560895
  • 博文数量: 252
  • 博客积分: 1068
  • 博客等级: 少尉
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 21:33
文章分类

全部博文(252)

文章存档

2013年(21)

2012年(231)

分类:

2012-06-12 09:14:06

原文地址:mini2440 led 驱动分析 作者:柳知语


友善推出的linux-2.6.32.2-mini2440  "drivers/char/mini2440_leds.c"
  这里是自己加的注释。加深理解。

1 #include <linux/miscdevice.h>
  2 #include <linux/delay.h>
  3 #include <asm/irq.h>
  4 #include <mach/regs-gpio.h>
  5 #include <mach/hardware.h>
  6 #include <linux/kernel.h>
  7 #include <linux/module.h>
  8 #include <linux/init.h>
  9 #include <linux/mm.h>
 10 #include <linux/fs.h>
 11 #include <linux/types.h>
 12 #include <linux/delay.h>
 13 #include <linux/moduleparam.h>
 14 #include <linux/slab.h>
 15 #include <linux/errno.h>
 16 #include <linux/ioctl.h>
 17 #include <linux/cdev.h>
 18 #include <linux/string.h>
 19 #include <linux/list.h>
 20 #include <linux/pci.h>
 21 #include <linux/gpio.h>
 22 #include <asm/uaccess.h>
 23 #include <asm/atomic.h>
 24 #include <asm/unistd.h>
 25
 26 /*定义设备名*/
 27 #define DEVICE_NAME "leds"
 28
 29 /*定义led的引脚号*/
 30 static unsigned long led_table [] = {
 31 S3C2410_GPB(5),
 32 S3C2410_GPB(6),
 33 S3C2410_GPB(7),
 34 S3C2410_GPB(8),
 35 };
 36 /*定义引脚配置的数组*/
 37 static unsigned int led_cfg_table [] = {
 38 S3C2410_GPIO_OUTPUT,
 39 S3C2410_GPIO_OUTPUT,
 40 S3C2410_GPIO_OUTPUT,
 41 S3C2410_GPIO_OUTPUT,
 42 };
 43 /*对应应用层的ioctl操作*/
 44 static int sbc2440_leds_ioctl(
 45 struct inode *inode,
 46 struct file *file,
 47 unsigned int cmd,
 48 unsigned long arg)
 49 {
 50 /*解析cmd*/
 51 switch(cmd) {
 52 case 0:
 53 case 1:
 54 if (arg > 4) {
 55 return -EINVAL;/*返回非法参数错误*/
 56 }
 57 s3c2410_gpio_setpin(led_table[arg], !cmd);/*设置相应引脚电平*/
 58 return 0;
 59 default:
 60 return -EINVAL;
 61 }
 62 }
 63
 64 /*文件操作*/
 65 static struct file_operations dev_fops = {
 66 .owner = THIS_MODULE,
 67 .ioctl = sbc2440_leds_ioctl,
 68 };
 69
 70 static struct miscdevice misc = {
 71 .minor = MISC_DYNAMIC_MINOR,/*在linux/miscdevice.h 中定义,值为255,在
misc_register()中再动态分配一个minor*/
 72 .name = DEVICE_NAME,
 73 .fops = &dev_fops,
 74 };
 75
 76 static int __init dev_init(void) //模块初始化函数

 77 {
 78 int ret;
 79
 80 int i;
 81
 82 /*把四个led对应的引脚初始化置为输出,且输出為低电平,灯亮*/
 83 for (i = 0; i < 4; i++) {
 84 s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);//配置引脚模式

 85 s3c2410_gpio_setpin(led_table[i], 0);//设置引脚电平

 86 }
 87
 88 /*注册特殊设备,可自动生成设备节点;此处应该加个错误处理吧。。*/
 89 ret = misc_register(&misc);
 90
 91 printk (DEVICE_NAME"\tinitialized\n");
 92
 93 return ret;
 94 }
 95
 96 static void __exit dev_exit(void)
 97 {
 98 /*注销设备*/
 99 misc_deregister(&misc);
100 }
101
102 module_init(dev_init);
103 module_exit(dev_exit);
104 MODULE_LICENSE("GPL");
105 MODULE_AUTHOR("FriendlyARM Inc.");




其中关于 misc device
来自“linux/miscdevice.h”

struct miscdevice {
 38 int minor;
 39 const char *name;
 40 const struct file_operations *fops;
 41 struct list_head list;
 42 struct device *parent;
 43 struct device *this_device;
 44 const char *nodename;
 45 mode_t mode;
 46 };

参考资料
阅读(389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~