赞
踩
一.内核配置,配置使其支持u盘
make menu_config
Device Drivers --->
[*]USB support -->
<*> USB Mass Storage support
u盘底层依赖scsi,所以scsi的配置也要配置好
二.设计更新代码
我是这么设计的:写个应用程序存放在文件系统的/bin目录下,取名update,执行这个程序会遍历 /dev/sd[drive][partition],
执行里面定义好的脚本文件,文件名约定为UpDate,脚本文件就可以调用busybox的通用Linux命令,rm,mkdir,cp,touch等命令
将u盘上的新二进制或其他文件替换掉旧的文件系统的文件.
2.1 update代码
这里cmd将设备文件路径作为第一个参数传递给脚本
那么执行的脚本里面就可以通过$1获取DEV(/media/sda1)
可以写个简单的脚本测试下
ok交叉编译应用程序update然后放在/bin下面吧
到这里可以在启动代码的执行脚本中执行/bin/update文件来执行u盘中UpDate更新程序了
但是事先必须先插上u盘才能在启动过程中执行启动脚本调用到update --重启自动
或者只能插上u盘手工运行update来更新程序. --手动
三.下面来做不用重启的自动,也就是插上u盘自动运行update
先测试下u盘插入到识别的原理吧
3.1插入u盘打印
hub_thread守护线程[khubd]检测到hub状态变化,根hub枚举新的usb设备,获取新的usb设备信息,创建usb_device(usb设备),调用usb_bus_type的match方法,找到对应的usb驱动(usb_driver),这里就是usb_storage_driver.匹配之后调用usb_storage_driver的probe方法storage_probe,接着usb_stor_probe2函数,接着创建一个usb_stor_scan_thread线程来扫描u盘
接着调用sisc总线scsi_bus_type的match方法,匹配接着sd_probe,接着sd_probe_async同步
接着调用/bin/mount创建设备节点
update的扫描是扫描设备节点,mount命令会调用系统调用sys_mount
所以我在sys_mount的方法中调用update
sys_mount定义在fs/namespace.c中
虽然感觉硬件--应用层--设备驱动--应用程--内核--应用程--shell这样的路子别扭别扭的,但我觉得对我来说是最简单的招吧
另一种方法:修改udev规则在/etc/udev/scripts下的mount.sh文件在"add"分支中添加/bin/update
四.简单的补充下u盘驱动的分析
1.入口函数
2.u盘设备驱动
3.支持设备id表
包含了一个unusual_devs.h头文件
该头文件包含了特殊的u盘设备id信息,也包含了通用的u盘设备类信息
u盘驱动probe方法
1.probe方法storage_probe
storage_probe分成了两部分,第一部分由usb_stor_probe1完成通用的配置,第二部分由usb_stor_probe2
2.第一部分probe usb_stor_probe1
这里主要是调用了scsi_host_alloc分配了Scsi_host对象
2.1 scsi_host_template对象
在scsi接口底层会调用到它的多个方法
3.第二部分probe usb_stor_probe2
这里添加了Scsi_Host对象并创建了一个线程
u盘扫描线程
在线程里会调用scsi_scan_host函数方法
这里面可以总结出u'盘的probe方法与下一层scsi接口的调用关系
在参考scsi的文档中有介绍这种模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。