既然知道了编写模块的方法,那么编写设备驱动程序自然也就不难了。我相信,每一个会写模块的人都不会觉得写设备驱动有困难。

真的,我没说假话,写驱动不是什么难事,你完全可以很自信地说,你已经可以写 设备驱动 了。对,没错,“飘柔,就这么自信。”

前面说了每一个模块都是以 module_init 开始,以 module_exit 结束的,那么我们就来看一下 U 盘驱动的这个模块。在茫茫人海中,我们很容易找到这个文件 drivers/usb/storage/usb.c ,在这个文件中又不难发现下面这段:

1068 static int __init usb_stor_init(void)

1069 {

1070 int retval;

1071  printk(KERN_INFO "Initializing USB Mass Storage driver.../n");

1072

1073  /* register the driver, return usb_register return code if err or */

1074   retval = usb_register(&usb_storage_driver);

1075  if (retval == 0) {

1076     printk(KERN_INFO "USB Mass Storage support registered./n");

1077      usb_usual_set_present(USB_US_TYPE_STOR);

1078    }

1079   return retval;

1080 }

1081

1082 static void __exit usb_stor_exit(void)

1083 {

1084    US_DEBUGP("usb_stor_exit() called/n");

1085

1086   /* Deregister the driver

1087     * This will cause disconnect() to be called for each

1088     * attached unit

1089     */

1090    US_DEBUGP("-- calling usb_deregister()/n");

1091   usb_deregister(&usb_storage_driver) ;

1092

1093    /* Don't return until all of our control and scanning threads

1094     * have exited.  Since each thread signals threads_gone as its

1095     * last act, we have to call wait_for_completion the right number

1096      * of times.

1097      */

1098    while (atomic_read(&total_threads) > 0) {

1099      wait_for_completion(&threads_gone);

1100      atomic_dec(&total_threads);

1101    }

1102

1103    usb_usual_clear_present(USB_US_TYPE_STOR);

1104 }

1105

1106 module_init(usb_stor_init);

1107 module_exit(usb_stor_exit);

其实, module_init/module_exit 只是一个宏,通常写模块的人为了彰显自己的个性,会给自己的初始化函数和注销函数另外取名字,比如这里 module_init(usb_stor_init) 以及 module_exit(usb_stor_exit) 实际上就是告诉这个世界,真正的函数是 usb_stor_init 和 usb_stor_exit 。这种伎俩在 Linux 内核代码中屡见不鲜,见多了也就不必大惊小怪了,天要下雨娘要嫁人,随她去吧。下面就从 usb_stor_init 正式开始我们的探索之旅。

*****************************

摘自《Linux那些事儿之我是USB》

《Linux那些事儿之我是USB》 链接为:china-pub 、当当 、卓越

《Linux 内核修炼之道》链接为: 卓越 、当当 、 china-pub

《Linux那些事儿之我是USB》我是U盘(4)想到达明天现在就要启程相关推荐

  1. Linux那些事儿之我是U盘(4)想到达明天,现在就要启程

    既然知道了怎么编写一个模块,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难.对自己行不行不确定的话,可以去问一下葛优,他准说:"(神州行),我看行. ...

  2. 【转】Linux那些事儿之我是U盘(4)想到达明天,现在就要启程

    既然知道了怎么编写一个模块,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难.对自己行不行不确定的话,可以去问一下葛优,他准说:"(神州行),我看行. ...

  3. Linux那些事儿 之 戏说USB(19)设备

    转载地址:http://blog.csdn.net/fudan_abc/article/details/1807800 第一眼看到struct usb_device这个结构,我仿佛置身于衡山路的酒吧里 ...

  4. 【转】Linux那些事儿 之 戏说USB(19)设备

    第一眼看到struct usb_device这个结构,我仿佛置身于衡山路的酒吧里,盯着舞池里扭动的符号,眼神迷离. 交大里苟了几年,毕业了又是住在学校附近的徐虹北路上,沿着虹桥路走过去,到徐家汇不过1 ...

  5. Linux那些事儿 之 戏说USB(5)我是谁

    我是谁?USB一遍一遍问着自己,当然它不会真的是一颗树.USB只是Linux庞大家族里的一个小部落,host controller是它们的族长,族里的每个USB设备都需要被系统识别,被我们识别.虽然清 ...

  6. Linux那些事儿 之 戏说USB(3)我是一棵树

    从拓扑上来看,USB子系统并不以总线的方式来部署,它是一颗由几个点对点的连接构成的树. 它主要包括了USB连接.USB host controller和USB device三个部分.而USB devi ...

  7. Linux那些事儿 之 戏说USB(33)字符串描述符

    关于字符串描述符,前面的前面已经简单描述过了,地位仅次于设备/配置/接口/端点四大描述符,那四大设备必须得支持,而字符串描述符对设备来说则是可选的. 这并不是就说字符串描述符不重要,对咱们来说,字符串 ...

  8. Linux那些事儿 之 戏说USB(25)设备的生命线(八)

    回到struct usb_hcd,继续努力的往下看. 7行,又见kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看drivers/usb/core/hcd ...

  9. Linux那些事儿 之 戏说USB(22)设备的生命线(五)

    下面接着看那三个基本点. 第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/core/urb.c里定义. struct ur ...

最新文章

  1. JSP 日期处理概述
  2. Select的OnChange()事件
  3. python闭包的原理_web前端:js 闭包原理
  4. web安全---XSS漏洞之标签使用2
  5. 本地修改指向服务器,本地修改指向服务器
  6. .Net页面中使用在线编辑框实例
  7. Oracle中查看所有表和字段
  8. 一个随机数发生器(一)
  9. 297 - Quadtrees
  10. 2021最新银行卡bin码
  11. 射频微电子学_专注于射频前端芯片,苏州汉天下完成新一轮融资
  12. Unity3D 导入资源
  13. 大数据-数据仓库的概念
  14. 百度大脑活体检测+合成图鉴别面前,人脸“照片活化”黑产攻击一秒被擒
  15. 如何使用google code
  16. 数据迁移方案-云迁移
  17. 浅谈脑机接口:传统神经学科的颠覆者
  18. 如何评测光源的好坏?
  19. 如何跟猎头有效的沟通?
  20. C++ 求最大公因数

热门文章

  1. 零基础开发小程序第四课-查看功能开发
  2. 关于XSS攻击及其防御
  3. matlab legend用法
  4. FATE单机部署遇到的问题
  5. Python 视频编辑教程之用几行 Python 代码自动创建 NBA 集锦,利用开源计算机视觉模型生成篮球亮点
  6. 电子手轮 (位置跟随,X轴或Y轴) 200smart、威纶通触摸屏
  7. MySQL 算数表达式
  8. [计划安排] 408经验帖(转自某大神)
  9. 【滤波】无迹卡尔曼滤波
  10. 主流浏览器内核有哪几种?