请教下:什么样的才是真正的Linux驱动开发
请教下:什么样的才是真正的Linux驱动开发
在文件系统基础上怎样搭建一套的Linux驱动架构?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
请教下:什么样的才是真正的Linux驱动开发
在文件系统基础上怎样搭建一套的Linux驱动架构?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
Linux设备驱动开发是不是以struct device_driver结构和driver_register和driver_unregister两个函数为最底层,在上面再搭建驱动框架?
什么叫真正的linux驱动开发?其实真的不好定义一个概念。
你理解的可能有一点片面。首先,驱动开发包括很多种设备类型:字符设备,块设备,网络设备。
他们的方式及实现机制存在一定的差异。在Linux下的驱动,必须借助于linux内核,因为驱动是跑在内核里面的,实现它的一些功能,并能与上层结合,同时又要使硬件正常工作起来。
这就是驱动程序承担的任务。
暂且就说这些吧,要表述的其实太多了。
我是要做一个字符型的设备驱动,但是不能用if (major) {
dev_id = MKDEV(major, 0);
retval = register_chrdev_region(dev_id, CS5535_GPIO_COUNT,
NAME);
} else {
retval = alloc_chrdev_region(&dev_id, 0, CS5535_GPIO_COUNT,
NAME);
major = MAJOR(dev_id);
}
if (retval) {
release_region(gpio_base, CS5535_GPIO_SIZE);
return -1;
}
printk(KERN_DEBUG NAME ": base=%#x mask=%#lx major=%d\n",
gpio_base, mask, major);
等这一套动作完成,我需要重新写一个注册动作等其他的一些工作
你看看ldd3的第三章
可能是我没讲清楚吧,上面贴出来的那些是关于设备号的工作,跟我的问题无关,我的问题是我不能用cdev_init(struct cdev *cdev, struct file_operations *fops); 这个函数去注册一个字符设备,要另外自己写个注册设备的函数
说一下我的看法,不过一般都是错误的
cdev_init()是linux中注册字符设备的函数,当然具体对象也有其他的注册方式,比如串口和misc,虽然它们有各自的注册函数,不过这些函数(块设备和网络除外)都是通过cdev_init()实现的!
楼主自己写个,只要是字符设备,应该都要用到这个函数的!
全属臆断,不要当真!
做驱动开发很牛吗?
我没觉得怎么牛
驱动程序也有简单和复杂之分,简单的驱动功能相对简单,例如读取期望的寄存器的值,并返回给应用程序;复杂的驱动,有些时候功能并不一定复杂,而是要考虑到多种情况,例如:并发与同步,定时,内存分配等等情况,要完成复杂的功能就肯定要借助于内核提供的种种机制;
其实做什么都一样,^_^
牛人自牛,烂人自烂,哈哈