3157|0

124

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

《原子嵌入式Linux驱动开发详解与实战》阅读体验3-简单LED驱动 [复制链接]

接触LED驱动前,先要引入MMU的概念,MMU 全称叫做 Memory Manage Unit,也就是内存管理单元,MMU 主要完成的功能包括:

1、完成虚拟空间到物理空间的映射;
2、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。

常规的Linux都是需要MMU的(之前有个ucLinux,不要MMU的MCU可以跑,但印象中现在很少人用了),CPU和MCU的区别之一就是MMU。

 

按照常规的Linux字符设备驱动编写步骤,逐一介绍LED驱动:

1.确定设备号

确定设备号200,再注册字符设备驱动。

  • retvalue = register_chrdev(LED_MAJOR, LED_NAME, &led_fops);
  • if(retvalue < 0){
  • printk("register chrdev failed!\r\n");
  • return -EIO;
  • }

 

2.定义 file_operations 结构体
创建一个结构体,用于定义字符设备驱动程序对外提供的操作接口。主要包括led open、read、write,以及release接口。

  • static struct file_operations led_fops = {
  • .owner = THIS_MODULE,
  • .open = led_open,
  • .read = led_read,
  • .write = led_write,
  • .release = led_release,
  • };

 

3.实现操作函数
实现字符设备驱动中定义的操作函数,根据设备的需求来进行相应的操作。

前面介绍的MMU虚拟内存地址概念用上了,怎么计算LED的地址需要参考硬件设计,这里的LED地址如下:

  • #define GPIO1_DR_BASE (0X0209C000)
  • #define GPIO1_GDIR_BASE (0X0209C004)

看个led write的实现函数,用于点亮/熄灭LED。

  • static ssize_t led_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
  • {
  • int retvalue;
  • unsigned char databuf[1];
  • unsigned char ledstat;
  • retvalue = copy_from_user(databuf, buf, cnt);
  • if(retvalue < 0) {
  • printk("kernel write failed!\r\n");
  • return -EFAULT;
  • }
  • ledstat = databuf[0]; /* 获取状态值 */
  • if(ledstat == LEDON) {
  • led_switch(LEDON); /* 打开LED灯 */
  • } else if(ledstat == LEDOFF) {
  • led_switch(LEDOFF); /* 关闭LED灯 */
  • }
  • return 0;
  • }

 

4.注册和注销字符设备

使用register_chrdev()函数进行设备注册,实现放在led初始化函数中。

  • retvalue = register_chrdev(LED_MAJOR, LED_NAME, &led_fops);
  • if(retvalue < 0){
  • printk("register chrdev failed!\r\n");
  • return -EIO;
  • }

使用unregister_chrdev()函数进行设备注销,放在驱动退出函数中。

  • unregister_chrdev(LED_MAJOR, LED_NAME);

 

查看本帖全部内容,请登录或者注册
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 14

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表