自制USB键盘来玩玩~~~~(源代码,原理图) |
http://computer00.21ic.org/user1/2198/archives/2007/36484.html |
http://computer00.21ic.org/uploadfile-/2007-3/324858822.rar |
自制USB鼠标来玩玩~~~~(源代码+原理图) |
http://computer00.21ic.org/user1/2198/archives/2007/36520.html |
http://computer00.21ic.org/uploadfile-/2007-3/324419698.rar |
圈圈的USB专区 |
http://group.ednchina.com/93/ |
讨论和学习USB的空间。现在USB技术已经很流行了,就像以前的串口一样。以前的电子工程师不会搞串口通信就落伍了, |
而现在的电子工程师如果不会搞 USB通信,那就落伍了。电子工程师门,还等什么,赶紧加入小组来学习USB吧……大家 |
也要多跟同事们推荐推荐,将我们的小组壮大起来~~~ |
"电脑圈圈的家当”21IC站 |
http://blog.21ic.com/user1/2198/index.html |
“电脑圈圈的家当”EDN站 |
http://blog.ednchina.com/computer00/ |
kernel/arch/arm/mach-pxa/littleton.c:268:static struct pxamci_platform_data littleton_mci_platform_data = { |
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) |
static struct pxamci_platform_data littleton_mci_platform_data = { |
.detect_delay = 20, |
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, |
.gpio_card_detect = GPIO_MMC1_CARD_DETECT, |
.gpio_card_ro = -1, |
.gpio_power = -1, |
}; |
static void __init littleton_init_mmc(void) |
{ |
pxa_set_mci_info(&littleton_mci_platform_data); |
} |
#else |
static inline void littleton_init_mmc(void) {} |
#endif |
kernel/arch/arm/mach-pxa/devices.c |
void __init pxa_set_mci_info(struct pxamci_platform_data *info) |
{ |
pxa_register_device(&pxa_device_mci, info); |
} |
void __init pxa_register_device(struct platform_device *dev, void *data) |
{ |
。。。。。。 |
dev->dev.platform_data = data; |
ret = platform_device_register(dev); |
。。。。。。 |
} |
======= |
SDIO,USB很复杂的 |
sdio相对简单,一半sd卡是通过sdio的接口做的,你可以参看以下实现的代码 |
SDIO (Input/Output)是一种IO接口规范。目前,其最主要用途是为带有SD卡槽的设备进行外设功能扩展。SDIO卡是一种IO外设,而不是Memory。SDIO卡外形与SD卡一致,可直接插入SD卡槽中。 |
目前市场上有多种SDIO接口的外设,比如SDIO蓝牙,SDIO GPS,SDIO无线网卡,SDIO移动电视卡等。这些卡底部带有和SD卡外形一致的插头,可直接插入SDIO卡槽(即为SD卡槽)的智能手机、PDA中,即可为这些手机、PDA带来丰富的扩展功能。用户可根据实际需要,灵活选择外设扩展的种类、品牌和性能等级。SDIO已为成为数码产品外设功能扩展的标准接口。 |
SDIO卡插入带有标准SD卡槽的设备后,如果该设备不支持SDIO,SDIO卡不会对SD卡的命令作出响应,处于非激活状态,不影响设备的正常工作;如果该设备支持SDIO卡,则按照规范的要求激活SDIO卡。 |
SDIO卡允许设备按IO的方式直接对寄存器进行访问,无须执行FAT文件结构或数据sector等复杂操作。此外,SDIO卡还能向设备发出中断,这是与SD memory卡的本质区别。 |
<6>[ 4426.160445] scsi10 : usb-storage 2-1.1:1. |
<5>[ 4427.164243] scsi 10:0:0:0: Direct-Access Generic- Multi-Card 1.00 PQ: 0 ANSI: 0 CCS |
<5>[ 4427.165148] sd 10:0:0:0: Attached scsi generic sg2 type 0 |
<5>[ 4428.115477] sd 10:0:0:0: [sdc] 498176 512-byte logical bock:(5 B23MB |
5[42.127 d1::::[d]WiePoeti f |
7[42.125 d1::::[d]MdSne 30 00 |
3[42.120 d1::::[d]Asmn rv ah:wietruh<3>[ 4428.148603] sd 10:0:0:0: [sdc] Assuming drive cache: write through |
<5>[ 4428.148613] sd 10:0:0:0: [sdc] Attached SCSI removable disk |
<6>[ 4440.957475] usb 2-1.1: USB disconnect, address 8 |
sd卡插入电脑上的sd卡插槽,dmesg的打印消息分析: |
kernel/drivers/scsi/scsi_scan.c |
static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,int *bflags, int async) |
sdev_printk(KERN_NOTICE, sdev, "%s %.8s %.16s %.4s PQ: %d " |
"ANSI: %d%s\n", scsi_device_type(sdev->type), |
sdev->vendor, sdev->model, sdev->rev, |
sdev->inq_periph_qual, inq_result[2] & 0x07, |
(inq_result[3] & 0x0f) == 1 ? " CCS" : ""); |
打印信息:Direct-Access Generic- Multi-Card 1.00 PQ: 0 ANSI: 0 CCS |
__scsi_add_device |
kernel/drivers/scsi/scsi_scan.c:1529: |
scsi_add_device |
__scsi_add_device |
scsi_probe_and_add_lun |
scsi_add_lun |
static int sg_add(struct device *cl_dev, struct class_interface *cl_intf) |
sdev_printk(KERN_NOTICE, scsidp,"Attached scsi generic sg%d type %d\n", sdp->index,scsidp->type); |
打印语句:Attached scsi generic sg2 type 0 |
kernel/drivers/scsi/sd.c:1601: |
static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer) |
sd_printk(KERN_NOTICE, sdkp, |
"%llu %d-byte logical blocks: (%s/%s)\n", |
(unsigned long long)sdkp->capacity, |
sector_size, cap_str_10, cap_str_2); |
打印信息: |
[sdc] 498176 512-byte logical bock:(5 B23MB |
kernel/drivers/scsi/sd.c:1808: |
static void sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) |
sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n"); |
打印信息: |
Assuming drive cache: write through |
kernel/drivers/scsi/sd.c:2085 |
static void sd_probe_async(void *data, async_cookie_t cookie) |
sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n",sdp->removable ? "removable " : ""); |
打印信息: |
Attached SCSI removable disk |
kernel/drivers/usb/core/hub.c:1542: |
void usb_disconnect(struct usb_device **pdev) |
dev_info (&udev->dev, "USB disconnect, address %d\n", udev->devnum); |
打印信息: |
USB disconnect, address 8 |
手机上sd卡插入流程分析: |
插入tf卡: |
<1>[ 1457.019046] ==============================msmsdcc_platform_status_irq ====================49 |
<1>[ 1457.621417] gpio49=0;set irq type to IRQF_TRIGGER_RISING |
<1>[ 1457.621577] gpio_get_value(49) ==================================================================================================== 0 |
<1>[ 1457.716442] ==============================msmsdcc_platform_status_irq ====================49 |
<1>[ 1458.318896] gpio49=1;set irq type to IRQF_TRIGGER_FALLING |
<1>[ 1458.319016] gpio_get_value(49) ==================================================================================================== 1 |
<6>[ 1458.330897] mmc0: Slot status change detected (0 -> 1) |
<6>[ 1458.641527] mmc0: new SD card at address aaaa |
<6>[ 1458.644532] mmcblk1: mmc0:aaaa SU01G 942 MiB |
<6>[ 1458.645171] mmcblk1: p1 |
拔掉 tf 卡: |
<1>[ 1533.397859] ==============================msmsdcc_platform_status_irq ====================49 |
<1>[ 1534.000232] gpio49=0;set irq type to IRQF_TRIGGER_RISING |
<1>[ 1534.000391] gpio_get_value(49) ==================================================================================================== 0 |
<6>[ 1534.012172] mmc0: Slot status change detected (1 -> 0) |
<3>[ 1534.017604] mmc_sd_detect(mmc0): Unable to re-detect card (-123) |
<6>[ 1534.023354] mmc0: card aaaa removed |
一个USB系统一般由一个USB主机(HOST)、一个或多个USB集线器(HUB)和一个或多个USB设备节点(NODE)组成。 |
USB协议规定了 USB主机与USB设备的主从关系,所以USB接口产品的应用离不开USB主机的开发。USB主机是包含 |
USB软件驱动和USB主机硬件功能接口的计算机系统实体。USB主机硬件是指USB主机控制器,它规定了USB主机硬 |
件接口,因而在设计USB协议栈时必须了解相关的USB主机控制器规范。 |
usb 模块这一下函数开始执行: |
static int __init usb_init(void) |
{ |
int retval; |
if (nousb) { |
pr_info("%s: USB support disabled\n", usbcore_name); |
return 0; |
} |
retval = usb_debugfs_init(); |
if (retval) |
goto out; |
retval = ksuspend_usb_init(); |
if (retval) |
goto out; |
retval = bus_register(&usb_bus_type); |
if (retval) |
goto bus_register_failed; |
retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb); |
if (retval) |
goto bus_notifier_failed; |
retval = usb_major_init(); |
if (retval) |
goto major_init_failed; |
retval = usb_register(&usbfs_driver); |
if (retval) |
goto driver_register_failed; |
retval = usb_devio_init(); |
if (retval) |
goto usb_devio_init_failed; |
retval = usbfs_init(); |
if (retval) |
goto fs_init_failed; |
retval = usb_hub_init(); |
if (retval) |
goto hub_init_failed; |
retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE); |
if (!retval) |
goto out; |
usb_hub_cleanup(); |
hub_init_failed: |
usbfs_cleanup(); |
fs_init_failed: |
usb_devio_cleanup(); |
usb_devio_init_failed: |
usb_deregister(&usbfs_driver); |
driver_register_failed: |
usb_major_cleanup(); |
major_init_failed: |
bus_unregister_notifier(&usb_bus_type, &usb_bus_nb); |
bus_notifier_failed: |
bus_unregister(&usb_bus_type); |
bus_register_failed:SDIO (Input/Output)是一种IO接口规范。目前,其最主要用途是为带有SD卡槽的设备进行外设功能扩展。SDIO卡是一种IO外设,而不是Memory。SDIO卡外形与SD卡一致,可直接插入SD卡槽中。 |
目前市场上有多种SDIO接口的外设,比如SDIO蓝牙,SDIO GPS,SDIO无线网卡,SDIO移动电视卡等。这些卡底部带有和SD卡外形一致的插头,可直接插入SDIO卡槽(即为SD卡槽)的智能手机、PDA中,即可为这些手机、PDA带来丰富的扩展功能。用户可根据实际需要,灵活选择外设扩展的种类、品牌和性能等级。SDIO已为成为数码产品外设功能扩展的标准接口。 |
SDIO卡插入带有标准SD卡槽的设备后,如果该设备不支持SDIO,SDIO卡不会对SD卡的命令作出响应,处于非激活状态,不影响设备的正常工作;如果该设备支持SDIO卡,则按照规范的要求激活SDIO卡。 |
SDIO卡允许设备按IO的方式直接对寄存器进行访问,无须执行FAT文件结构或数据sector等复杂操作。此外,SDIO卡还能向设备发出中断,这是与SD memory卡的本质区别。 |
ksuspend_usb_cleanup(); |
out: |
return retval; |
} |
kernel/drivers/usb/core/hub.c:3407: |
int usb_hub_init(void) |
khubd_task = kthread_run(hub_thread, NULL, "khubd"); |
hub_events(); |
if (connect_change) |
hub_port_connect_change(hub, i,portstatus, portchange); |
浅析usb转serial串口设备在linux内核中枚举创建及生成tty设备的全过程 |
http://blogold.chinaunix.net/u3/114440/showart.php?id=2237148 |
kernel/drivers/Makefile |
------------------------------------------------ |
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y |
CONFIG_USB_PWC_INPUT_EVDEV=y |
CONFIG_USB_HID=y |
CONFIG_USB_SUPPORT=y |
CONFIG_USB_ARCH_HAS_HCD=y |
CONFIG_USB_ARCH_HAS_EHCI=y |
CONFIG_USB=y |
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y |
CONFIG_USB_DEVICE_CLASS=y |
CONFIG_USB_SUSPEND=y |
CONFIG_USB_OTG=y |
CONFIG_USB_EHCI_HCD=y |
CONFIG_USB_EHCI_EHSET=y |
CONFIG_USB_EHCI_ROOT_HUB_TT=y |
CONFIG_USB_EHCI_MSM=y |
CONFIG_USB_ACM=y |
CONFIG_USB_STORAGE=y |
CONFIG_USB_STORAGE_DATAFAB=y |
CONFIG_USB_STORAGE_FREECOM=y |
CONFIG_USB_STORAGE_ISD200=y |
CONFIG_USB_STORAGE_USBAT=y |
CONFIG_USB_STORAGE_SDDR09=y |
CONFIG_USB_STORAGE_SDDR55=y |
CONFIG_USB_STORAGE_JUMPSHOT=y |
CONFIG_USB_STORAGE_ALAUDA=y |
CONFIG_USB_STORAGE_ONETOUCH=y |
CONFIG_USB_STORAGE_KARMA=y |
CONFIG_USB_STORAGE_CYPRESS_ATACB=y |
CONFIG_USB_EHSET_TEST_FIXTURE=y |
CONFIG_USB_GADGET=y |
CONFIG_USB_GADGET_SELECTED=y |
CONFIG_USB_GADGET_MSM_72K=y |
CONFIG_USB_MSM_72K=y |
CONFIG_USB_GADGET_DUALSPEED=y |
CONFIG_USB_ANDROID=y |
CONFIG_USB_ANDROID_DIAG=y |
CONFIG_USB_ANDROID_CDC_ECM=y |
CONFIG_USB_ANDROID_RNDIS=y |
CONFIG_USB_ANDROID_RNDIS_WCEIS=y |
CONFIG_USB_ANDROID_RMNET=y |
CONFIG_USB_F_SERIAL=y |
CONFIG_USB_CSW_HACK=y |
CONFIG_USB_OTG_UTILS=y |
CONFIG_USB_MSM_OTG_72K=y |
obj-$(CONFIG_USB_OTG_UTILS) += usb/otg/ |
obj-$(CONFIG_USB) += usb/ |
obj-$(CONFIG_USB_MUSB_HDRC) += usb/musb/ |
obj-$(CONFIG_PCI) += usb/ |
obj-$(CONFIG_USB_GADGET) += usb/gadget/ |
----------------------------------------------- |
CONFIG_MMC=y |
CONFIG_MMC_UNSAFE_RESUME=y |
CONFIG_MMC_PARANOID_SD_INIT=y |
CONFIG_MMC_BLOCK=y |
CONFIG_MMC_MSM=y |
CONFIG_MMC_MSM_SDIO_SUPPORT=y |
CONFIG_MMC_MSM_SDC1_SUPPORT=y |
CONFIG_MMC_MSM_SDC2_SUPPORT=y |
CONFIG_MMC_MSM_PROG_DONE_SCAN=y |
obj-$(CONFIG_MMC) += mmc/ |
----------------------------------------------- |
static int msmsdcc_probe(struct platform_device *pdev) |
kernel/drivers/mmc/host/msm_sdcc.c:1384: |
mmc = mmc_alloc_host(sizeof(struct msmsdcc_host), &pdev->dev); |
kernel/drivers/usb/gadget/msm72k_udc.c |
kernel/drivers/mmc/host/msm_sdcc.c |
r756 | mohuifu | 2011-01-12 17:34:06 +0800 (三, 2011-01-12) | 2 行 |
改变的路径: |
M /branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/kernel/arch/arm/mach-msm/board-msm7x27.c |
M /branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/kernel/drivers/mmc/host/msm_sdcc.c |
some machine can't startup because sdcc2 wakeup irq.this delete that irq. |
------------------------------------------------------------------------ |
r1060 | yangjinning | 2011-01-22 11:37:01 +0800 (六, 2011-01-22) | 2 行 |
改变的路径: |
M /branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/kernel/arch/arm/mach-msm/board-msm7x27.c |
M /branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/kernel/drivers/mmc/host/msm_sdcc.c |
tf card dynamic plug support and mmc power change |
------------------------------------------------------------------------ |
r1092 | yangjinning | 2011-01-24 09:42:58 +0800 (一, 2011-01-24) | 2 行 |
改变的路径: |
M /branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/kernel/arch/arm/mach-msm/board-msm7x27.c |
M /branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/kernel/drivers/mmc/host/msm_sdcc.c |
change the tf detect trigger type from edge to level |
android 系统usb内核配置 |
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y |
CONFIG_USB_ANDROID=y |
CONFIG_USB_ANDROID_DIAG=y |
CONFIG_USB_ANDROID_CDC_ECM=y |
CONFIG_USB_ANDROID_RNDIS=y |
CONFIG_USB_ANDROID_RNDIS_WCEIS=y |
CONFIG_USB_ANDROID_RMNET=y |
USB OTG 设备既能做主机,又能做设备。 |
USB HOST是指主机。 |
当OTG 插到 HOST 上,OTG 的角色 就是 device. |
当device 插到 OTG 上,OTG 的角色就是 HOST. |
USB On-The-Go 在USB 规范基础上增加了以下几点 |
1 双重功能设备设备既可用作主机也可用作外设 |
2 主机处理协议HNP 用于转换USB 主机和外设功能 |
3 对话请求协议 |
4 除小和大功率之外增加了微功率选择 |
5 超小连接器 |
注:一个On-The-Go 设备并不局限于仅跟另一个On-The-Go 设备相连由于内置有USB 主机和USB外设所以当外部连接一个USB |
外设时它用作USB 主机类似地当外部连接一个USB 主机时它用作USB 外设.HNP 是一种用来实现A Device 和B Device |
主机/从机转换的机构(实际上是电缆的反转). |
Android是为指尖触摸设备而设计的,对鼠标支持并不好,就算你插上鼠标并能成功识别,Android也只是把你的鼠标识别成5向滚轮键而以,界面上并不会出现鼠标光标。 |
不过,开源社区有一些项目意在将ANDOIRD移植到PC上网本上,他们自行在ANDROID中增加了鼠标的支持,例如 android-x86 项目,你可以参考他们的实现,自行定制 Android 源代码。 |
platform 是一个虚拟的地址总线,相比 PCI、USB,它主要用于描述 SOC 上的片上资源。比如 S3C2410 上集成的控制器( LCD、Watchdog、RTC等),platform 所描述的资源有一个共同点:在 CPU 的总线上直接取址。 |
static void __init do_basic_setup(void) |
{ |
init_workqueues(); |
cpuset_init_smp(); |
usermodehelper_init(); |
init_tmpfs(); |
driver_init(); |
init_irq_proc(); |
do_ctors(); |
do_initcalls(); |
} |
kernel/arch/arm/mach-msm/devices-msm7x27.c |
struct platform_device msm_device_i2c = { |
.name = "msm_i2c", |
.id = 0, |
.num_resources = ARRAY_SIZE(resources_i2c), |
.resource = resources_i2c, |
}; |
kernel/drivers/base/bus.c:879:int bus_register(struct bus_type *bus) |
kernel/drivers/base/bus.c:952:EXPORT_SYMBOL_GPL(bus_register); |
kernel/drivers/i2c/i2c-core.c:1038:static int __init i2c_init(void) |
kernel/drivers/i2c/i2c-core.c:1078:postcore_initcall(i2c_init); |
./kernel/drivers/i2c/i2c-core.c |
msm_i2c_init_driver |
2c-client的驱动放在drivers/i2c/chips,就是某个具体i2c设备的驱动 |
底层i2c总线的驱动放在drivers/i2c/busses,就是跟CPU相关的i2c接口 |
drivers/i2c/algos放着i2c上的算法,什么算法,就是如何实现i2c总线上的时序,当然,如果drivers/i2c/busses的CPU相关代码有实现的话就不会用这一部分 |
i2c-core.c更重要的实现管理和提供一些API接口 |
i2c-dev.c实现的就是总线访问接口 |
2c-dev.c是实现了一个I2C总线上所有i2c-client的访问,这一点你可以通过Documentation/i2c/dev-interface的介绍来理解,所以i2c-dev.c可以理解为总线驱动。 |
根据Documentation/i2c/dev-interface,举例来说,假如一个I2C总线上有两个设备,地址为0x40和0x50。 |
高通平台 sdcard 插入流程分析 |
==============================msmsdcc_platform_status_irq ====================49 |
<1>[12631.253213] gpio49=1;set irq type to IRQF_TRIGGER_FALLING |
<1>[12631.253243] gpio_get_value(49) ==================================================================================================== 1 |
<6>[12631.253275] mmc0: Slot status change detected (0 -> 1) |
<1>[12631.253641] =================================================msm_sdcc_setup_power pdev->id=0xc06bde88 ; vdd=6 |
<4>[12631.253675] ---->poweron mmc |
<4>[12631.256233] -----lubingquan ANDROID_ALARM_GET_TIME------ |
<4>[12631.256281] -----lubingquan alarm_type------3 |
<4>[12631.256291] |
<1>[12631.270523] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.270565] ---->poweron mmc |
<1>[12631.290456] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.290491] ---->poweron mmc |
<1>[12631.293273] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.293305] ---->poweron mmc |
<1>[12631.320621] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.320655] ---->poweron mmc |
<1>[12631.320831] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.320858] ---->poweron mmc |
<1>[12631.323450] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.323480] ---->poweron mmc |
<1>[12631.544273] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.544316] ---->poweron mmc |
<1>[12631.554741] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.554773] ---->poweron mmc |
<1>[12631.554978] =================================================msm_sdcc_setup_power pdev->id=0x00000001 ; vdd=1 |
<4>[12631.555005] ---->poweron mmc |
<6>[12631.555211] mmc0: new SD card at address aaaa |
<6>[12631.557031] mmcblk0: mmc0:aaaa SU01G 942 MiB |
<6>[12631.557330] mmcblk0: p1 |
static void mmc_power_up(struct mmc_host *host) |
mmc_set_ios(host); |
kernel/drivers/mmc/core/core.c:627: host->ops->set_ios(host, ios); |
kernel/drivers/mmc/host/msm_sdcc.c:1073: if (host->plat->translate_vdd) |