Linux嵌入式驱动初体验(七)--- LED驱动之字符设备篇

      Linux中的设备可以分为三类:字符设备、块设备、网络设备,对于上一篇文章中的驱动编写的方法,是基于platform结构的,下面我们把它改变成字符设备的驱动编写模式,原理和方法基本是一样的,只是换了一个外壳而已。

      首先还是看一下依照字符设备驱动编写所设计的数据结构:

 

很眼熟也很简单,对于后面的两个东西的定义,你可以理解成是我多此一举了,不过其实这只是因为这个设备比较简单的原因,如果是其他设备,led_dev_t里面的内容会更多的。对于cdev这个结构体大家可能不熟悉,我先贴出来给大家看看:

 

它在/include/linux/cdev.h中定义,其实也都是一些大家“喜闻乐见”的东西了。好了,下面我们就又要开始填充这些函数了:

 

其实只看上一篇文章就可以知道这些函数的实现原理和过程了,而且上面的这些函数写的更加简短了,因为我们的目的明确,而且“不拘小节”(就是忽略了一些除错处理,不要学我,呵呵。。。)。好了,其实上面也不是重点,它们还体现不出来我们在写一个字符驱动,真正能让我们有所区别的是init和exit的编写:

 

MKDEV,用来给设备分配设备号,然后使用register_chrdev_region来进行字符设备的注册,使用cdev_add向系统中添加这个字符设备,使用cdev_del删除字符设备,这些也都是系统中已经有的宏定义。

      最后我再把代码的剩余部分贴出来:

 

不用说明,只是为了保持代码的完整性。当然,这还不是字符驱动开发的全部,我们还要有测试程序:

 

其实和上一篇的那个测试程序是一样的,只是更好看了一点。。。不过还有一点不同时体现在代码之外的,就是对于一个字符设备来说,它还需要一个/dev下的对应的结点文件,这个文件是自己手动加入的,而且重启开发板后,这个手动创建的文件就没有了,所以为了方便起见,我写了一个简单的shell脚本,在运行这个测试程序之前运行脚本文件,就可以了:

 

其中的248是我自己设置的主设备号,这个号码要和驱动程序中的LED_MAJOR保持一致,而且要保证这个主设备号是空闲的。

      好了,一个LED的字符驱动就写好了,之所以写的比较简单,分析的比较少,是因为其实它们和上一篇的驱动是比较类似的,在那里已经做了比较详细的分析,这里只是说明了一下字符设备驱动的编写和platform体系驱动的编写的不同,两者可以达到同样的目的,只是platform有一些面向对象的感觉,更加有章法一些。现在的学习都是在学习方法,其实对于简单的事物,我们千万不要看不起它,如果我们可以很重视的把它解决,那么遇到难的问题,用同样的方法还是可以行得通的。综上所述吧,就是学会举一反三,有很多东西,解决的模式是一定的,而且是一样的,都有相通的地方,我们学习的时候就要抓住重点,学习方法,而不是只针对一个事物学习,这样就真的是要“活到老学到老了”。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值