zzz

 

自制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)

你可能感兴趣的:(android,struct,cache,扩展,resources,linux内核)