自己看驱动,有些问题不懂,请教各位大虾指教下:
设备驱动分为字符设备驱动、块设备驱动、网络设备驱动。
是不是每种驱动对应一个结构体,比如说字符设备对应struct cdev。
触摸屏的驱动程序应该也可以看成字符设备驱动来编写,但是我看书上写了这样一个函数
int __init s3c2410_ts_init( void )
{
return driver_register(&s3c2410_ts_driver);
}
他这个里面要注册驱动,为什么不用cdev_init , cdev_add 系列的函数。而是调用了driver_register这个函数?这个函数也是内核函数,还是开发板自带的已经编写好的函数?有点不明白了。
麻烦有心人给我解释下,说详细点,这个问题困扰了几天了。。驱动很难看下去了
------最佳解决方案--------------------
哎,为什么我说要跟踪代码?从你说
就知道你没跟踪代码。跟进去了以后,你就知道这个函数的作用,然后也会知道它最后会调用驱动里的probe函数,而probe里函数里会用cdev_init之类的进行注册。
学习驱动的方法就是这样,不停跟踪函数,光看书是没用的。
------其他解决方案--------------------
driver_register是内核标准的api来的,主要是注册一个驱动到bus上,具体是什么bus,要看s3c2410_ts_driver里面的定义。
另外,系统在register_device的时候会根据bus找到这个设备相应的驱动程序,然后调用s3c2410_ts_driver里面的probe函数,去做一些初始化的工作,这些工作可以用来初始化设备的状态,还有你需要注册的设备类型,比如说是cdev,bdev,netdev等等,当然这些都是利用char_dev_register,或者block_dev_register等类似函数来把驱动注册到虚拟文件系统当中,主要是为了和上层打交道。
当然你也完全可以在init的时候来做这些事情,但是linux驱动模型支持同一个驱动对应多个设备。为了你的驱动能够复用,比如说s3c2410_ts_driver这个驱动对应两个touchscreen的话,你就没有必要写两个独立的驱动,而是用id号来区分,并且在probe的时候进行id号的识别,这样,一套代码,可以驱动两个类似的设备,何乐不为呢?如果在init函数里来做,那你就得用两个驱动了。
------其他解决方案--------------------
看看2.6的设备驱动模型
------其他解决方案--------------------
你跟踪这个代码看下去就知道了
------其他解决方案--------------------
等于没说,有些问题你知道的话,可以简单化,稍微提点一下我就懂了。跟踪代码,这个意见有价值么?谁看不懂的时候不会去跟踪代码看?
OK?也许你会说不想提点,说问题太简单?那么你就不要回复这样的内容,我也不想浪费时间看这种回复,浪费?
------其他解决方案--------------------
嗯,我已经找了个模型在看了,谢谢
------其他解决方案--------------------
不好意思,回复错了,我想说楼下的。
------其他解决方案--------------------
同意楼上说法,其实不用多跟踪,看看流程即可.而且有什么不明白的,可以去看linux内核的代码,看他们的驱动如何写.貌似这些都是应该必备的.
------其他解决方案--------------------
详见 linux设备驱动模型,你说的字符 块 网络只是linux划分出来的类,的确现在很难离开这3种,但不带表不会有,所以linux提供了一套机制
------其他解决方案--------------------
该回复于2012-11-15 22:29:19被管理员删除