当前位置: 代码迷 >> 驱动开发 >> linux 驱动开发,该如何处理
  详细解决方案

linux 驱动开发,该如何处理

热度:3   发布时间:2016-04-28 10:33:56.0
linux 驱动开发
自己看驱动,有些问题不懂,请教各位大虾指教下:
   设备驱动分为字符设备驱动、块设备驱动、网络设备驱动。
   是不是每种驱动对应一个结构体,比如说字符设备对应struct cdev。
    触摸屏的驱动程序应该也可以看成字符设备驱动来编写,但是我看书上写了这样一个函数
     int __init s3c2410_ts_init( void )
     {
          return driver_register(&s3c2410_ts_driver);
     }

     他这个里面要注册驱动,为什么不用cdev_init , cdev_add 系列的函数。而是调用了driver_register这个函数?这个函数也是内核函数,还是开发板自带的已经编写好的函数?有点不明白了。

麻烦有心人给我解释下,说详细点,这个问题困扰了几天了。。驱动很难看下去了
------解决方案--------------------
哎,为什么我说要跟踪代码?从你说
引用
而是调用了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函数里来做,那你就得用两个驱动了。