IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


嵌入式linux下LED驅動教程

分享到:
           

    在嵌入式系統的設計中,LED一般直接由CPU的GPIO(通用可編程I/O口)控制。GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數據寄存器?刂萍拇嫫骺稍O置GPIO口的工作方式為輸入或是輸出。當引腳被設置為輸出時,向數據寄存器的對應位寫入1和0會分別在引腳上產生高電平和低電平;當引腳設置為輸入時,讀取數據寄存器的對應位可獲得引腳上的電平為高或低。

    LED設備介于字符設備和塊設備之間我們稱之為misc(雜設備),其實按linux下的驅動位置來講還是一種字符設備。代碼清單1.1給出了Linux下LED的驅動。

代碼清單1.1 Linux操作系統下LED的驅動

    1 #include .../*包含內核中的多個頭文件*/

    2 /*設備結構體*/
    3 struct light_dev {
    4     struct cdev cdev; /*字符設備cdev結構體*/
    5     unsigned char vaule; /*LED亮時為1,熄滅時為0,用戶可讀寫此值*/
    6 };

    7 struct light_dev *light_devp;
    8 int light_major = LIGHT_MAJOR;

    9 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
    10 MODULE_LICENSE("Dual BSD/GPL");
    11 /*打開和關閉函數*/
    12 int light_open(struct inode *inode, struct file *filp)
    13 {
    14     struct light_dev *dev;
    15     /* 獲得設備結構體指針 */
    16     dev = container_of(inode->i_cdev, struct light_dev, cdev);
    17     /* 讓設備結構體作為設備的私有信息 */
    18     filp->private_data = dev;
    19     return 0;
    20 }

    21 int light_release(struct inode *inode, struct file *filp)
    22 {
    23     return 0;
    24 }

    25 /*讀寫設備:可以不需要 */
    26 ssize_t light_read(struct file *filp, char __user *buf, size_t count,
    27     loff_t *f_pos)
    28 {
    29     struct light_dev *dev = filp->private_data; /*獲得設備結構體 */
    30     if (copy_to_user(buf, &(dev->value), 1))
    31         return -EFAULT;

    32     return 1;
    33 }

    34 ssize_t light_write(struct file *filp, const char __user *buf, size_t count,
    35 loff_t *f_pos)
    36 {
    37     struct light_dev *dev = filp->private_data;

    38     if (copy_from_user(&(dev->value), buf, 1))
    39         return -EFAULT;

    40     /*根據寫入的值點亮和熄滅LED*/
    41     if (dev->value == 1)
    42         light_on();
    43     else
    44         light_off();

    45     return 1;
    46 }

    47 /* ioctl函數 */
    48 int light_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
    49     unsigned long arg)
    50 {
    51     struct light_dev *dev = filp->private_data;

    52     switch (cmd) {
    53     case LIGHT_ON:
    54         dev->value = 1;
    55         light_on();
    56         break;
    57     case LIGHT_OFF:
    58         dev->value = 0;
    59         light_off();
    60         break;
    61     default:
    62         /* 不能支持的命令 */
    63         return -ENOTTY;
    64     }

    65     return 0;
    66 }

    67 struct file_operations light_fops = {
    68     .owner = THIS_MODULE,
    69     .read = light_read,
    70     .write = light_write,
    71     .ioctl = light_ioctl,
    72     .open = light_open,
    73     .release = light_release,
    74 };

    75 /*設置字符設備cdev結構體*/
    76 static void light_setup_cdev(struct light_dev *dev, int index)
    77 {
    78     int err, devno = MKDEV(light_major, index);
    79     cdev_init(&dev->cdev, &light_fops);
    80     dev->cdev.owner = THIS_MODULE;
    81     dev->cdev.ops = &light_fops;
    82     err = cdev_add(&dev->cdev, devno, 1);
    83     if (err)
    84         printk(KERN_NOTICE "Error %d adding LED%d", err, index);
    85 }

    86 /*模塊加載函數*/
    87 int light_init(void)
    88 {
    89     int result;
    90     dev_t dev = MKDEV(light_major, 0);
    91     /* 申請字符設備號*/
    92     if (light_major)
    93         result = register_chrdev_region(dev, 1, "LED");
    94     else {
    95         result = alloc_chrdev_region(&dev, 0, 1, "LED");
    96         light_major = MAJOR(dev);
    97     }
    98     if (result < 0)
    99         return result;

    100     /* 分配設備結構體的內存 */
    101     light_devp = kmalloc(sizeof(struct light_dev), GFP_KERNEL);
    102     if (!light_devp) {
    103         result = -ENOMEM;
    104         goto fail_malloc;
    105     }
    106     memset(light_devp, 0, sizeof(struct light_dev));
    107     light_setup_cdev(light_devp, 0);
    108     light_gpio_init();
    109     return 0;

    110 fail_malloc:
    111     unregister_chrdev_region(dev, light_devp);
    112     return result;
    113 }

    114 /*模塊卸載函數*/
    115 void light_cleanup(void)
    116 {
    117     cdev_del(&light_devp->cdev); /*刪除字符設備結構體*/
    118     kfree(light_devp); /*釋放在light_init中分配的內存*/
    119     unregister_chrdev_region(MKDEV(light_major, 0), 1); /*刪除字符設備*/
    120 }

    121 module_init(light_init);
    122 module_exit(light_cleanup);

   熱點鏈接:

   1、嵌入式linux驅動要學哪些
   2、典型嵌入式Linux系統設置

更多新聞>> 

主站蜘蛛池模板: 婴童人才网-孕婴童、母婴行业人才招聘求职系统 | 郑州办公家具厂_河南办公家具厂_河南办公家具-河南华诺家具 | 上海航空货运,上海空运,东方航空快递,机场物流,航空快运,上海东方航空托运公司 | 印刷包装网_印刷包装_机械设备_行业动态_展会信息 | 运动控制器_数控系统_廊坊市九盈数控技术公司「官网」 | 江门高空车出租|高空作业设备出租|中特设备租赁有限公司 | 绍兴宇力半导体有限公司官网| 家具板|橱柜衣柜家具板|木饰面定制|榉木胶合板|防水胶合板|胶合板厂家-佛山吉盛唐朝木业-大坂木业 | 新中式家具,广东新中式家具,广州新中式家具,佛山新中式家具,顺德新中式家具,乐从新中式家具,新中式家具厂家直销--唐明雅居 | 太原重卡叔叔运输有限公司-山西太原大件运输、太原物流公司、太原货运物流、太原大件运输、太原货运信息、长治物流公司、长治大件运输、晋城物流公司、晋城大件运输、忻州大件运输、朔州大件运输、阳泉大件运输、大同大件运输、吕梁大件运输、临汾大件运输、运城大件运城 | 全球石油化工网 - 石油化工资讯,石油化工机械,石油化工设备,石油化工贸易,石油化工技术,尽在石油化工网 | 天之水网_新时代主流门户网站 十大文明网,主流新媒 、 值得信赖、关注我、温暖你! | 上海视研装饰工程有限公司-上海标识公司,上海标识设计 | 诸城市瑞特机械有限公司_洗筐机,周转箱,托盘清洗机,风淋室 | 铸铁平台-焊接平台-划线平台-三维焊接平台厂家-泊头市溪海冶金机械设备有限公司 | 冷缩电缆附件_热缩电缆附件-乐清安尚电气有限公司 | 筱晓(上海)光子技术有限公司官网,MCT探测器,半导体激光二极管,中红外QCL激光器,光纤放大器,光电探测器 | 污水处理设备-污泥脱水设备-纯水净水设备-山东善丰机械科技有限公司 | 重庆自考网-重庆自学考试 | 美标球阀_美标闸阀-浙江川一阀门有限公司 | 银龙制冷—北京冷库工程建设安装公司!【20年专业制冷】 | 南京文化墙设计公司,南京包装设计制作印刷,南京PPT设计公司,导视制作公司,企业logo设计 | 长沙广告设计公司|长沙广告制作|湖南户外广告制作|商业美陈就找湖南盛翔文化传媒有限公司老品牌高品质 | 铝基板_铜基板_铝基板厂家诚之益电路—汽车灯铜基板行业制商 | 聚合氯化铝pac-聚氯化铝-饮水级工业级聚合氯化铝-聚合氯化铝厂家价格 | 览众房车,房车, 房车厂家, 房车价格, 房车图片,, 四驱房车, 皮卡房车, 越野房车, 依维柯房车, 国产房车, 自动挡房车, | 免费照片视频制作软件_照片做成视频的软件_制作照片视频的软件 - 万彩影像大师官网 | 洒水车|冷藏车|LED广告车|油罐车|道路救援车|垃圾车|程力专用汽车股份有限公司销售九分公司 | 全屋定制超市_全屋定制加盟_星空梵高全屋定制招商 | 陶瓷复合钢管-专业提供江苏陶瓷钢管和陶瓷内衬复合钢管的生产厂家 | 商用车之家——观点有态度 热点不缺席 靠谱的商用车门户网站 | 九江市石化塑业有限公司| 昆明纸箱厂-礼盒定制-包装盒定做-纸箱厂-云南包掌柜包装有限公司 | 压瓦机|C型钢机|彩钢设备|C/Z互换檩条机-河北玉发压瓦机 | 推荐|广佛一条龙高端茶到底有多香| 水溶肥料-大量元素水溶肥-含氨基酸水溶肥料-高塔复合肥-水溶肥生产厂家-河南中黄特肥科技有限责任公司 | 泰州LOGO设计-品牌VI设计-泰州广告设计公司-大唐歌飞广告设计公司 | 推拉雨棚,防雨棚,遮阳遮雨棚,伸缩雨棚,移动雨棚,电动雨棚,雨棚制作厂家 - 山东创力篷业 | 现代卓越官网-专注于pmp培训证书-pmp考试报名时间-pmp认证-项目管理pmp-ACP敏捷管理-NPDP认证 | 生物柴油设备,乙醇精馏塔,醋酸精馏塔生产厂家-无锡弘鼎华化工设备有限公司 | 深圳理津技术有限公司(REHLOGY)-全球工业品供应商:自动化产品|仪器仪表|设备|备品备件|工具|消耗品|非标设备|建筑工程等一站式综合服务! |