LK里的USB部分

      我们的支持关机充电,  移植LCD时需要在bootloader里面加入lcd的驱动,在移植的过程中看了一下USB相关的代码,一直想看LINUX 的USB驱动都没看,这次在LK里面看看,也许更简单,只是理解一下如何检测到USB线接入及如何判断接入类型。

硬件定义:

一般4根线

VBUS :USB电压(5V)

DM, DP:USB两根差分信号,也叫D-,D+ 。 //这两根用来传输数据
GND :电源地,0电平。

SHLD:固定USB座子的两个或四个定位孔。

软件:

充电相关的主要有以下两个方面,相关的代码在./bootable/bootloader/lk/platform/msm_shared/hsusb.c

/* for USB charging */
#define TRUE              1
#define FALSE             0
#define PORTSC_LS         (3 << 10) /* Read - Port's Line status */
#define B_SESSION_VALID   (1 << 11)

1)判断USB线接入

/* check if USB cable is connected
 *
 * RETURN: If cable connected return 1
 * If cable disconnected return 0
 */
int is_usb_cable_connected(void)
{
    /*Verify B Session Valid Bit to verify vbus status*/
    if (B_SESSION_VALID & readl(USB_OTGSC)) {
        return 1;
    } else {
        return 0;
    }
}

当有usb线接入时,CPU会检测到vbus上的5v电压,cpu相应的usb寄存器会置位,软件上就可通过读取此寄存器来判断是否有cable接入。

对于判断是否有USB线接入这种情况,做软件的可以略过硬件实现,直接认为插入USB线就是把某个寄存器置位(当然实际是把好多寄存器都置位了)!

如何看懂这个函数?

#define USB_OTGSC            (MSM_USB_BASE + 0x01A4)、//寄存器地址

#define B_SESSION_VALID   (1 << 11)  //此寄存器相应的bit位

查看MSM的SPEC,如下
0x1A4(地址偏移量)       USB OTG High Speed Software(寄存器名称)
                                               USB_OTG_HS_OTGSC
                                               Type: Read/Write
                                               Clock: CC_USB_OTG_HS_CLK
                                               Reset State: 00000020

寄存器value是32bit,每个bit控制不同的内容,对第12bit的说明如下

B session valid
Read-only
Indicates that the Vbus is above the B session valid threshold.


所以此位如果是1,则usb cable接入;此位如果是0,则usb cable没接入。

2)判断是何种CHARGE类型:WALL CAHNGER or PC CHAGER

/* Charger detection code
 * Set global flags WALL_CHARGER and
 * RETURN: type of charger connected
 * CHG_WALL
 * CHG_HOST_PC
 * */
int usb_chg_detect_type(void)
{
    int ret = CHG_UNDEFINED;

    if ((readl(USB_PORTSC) & PORTSC_LS) == PORTSC_LS)
    {
        if(charger_usb_is_charger_connected() == TRUE) {
            WALL_CHARGER = TRUE;
            HOST_CHARGER = FALSE;
            charger_usb_i(1500);
            ret = CHG_WALL;
        }
    }
    else
    {
        if(charger_usb_is_pc_connected() == TRUE) {
            WALL_CHARGER = FALSE;
            HOST_CHARGER = TRUE;
            ret = CHG_HOST_PC;
        }
    }
    return ret;
}
如何看懂这个函数?

#define USB_PORTSC           (MSM_USB_BASE + 0x0184)

#define PORTSC_LS         (3 << 10) /* Read - Port's Line status */

在MSM的spec中搜索PORTSC,可以定位到如下内容
MSM7227TM/MSM7227-1TM Mobile Station ModemTM Software Interface
0x184     USB_OTG_HS_PORTSC
                Type: Read/Write
                 Clock: CC_USB_OTG_HS_CLK
                 Reset State: 0x0

                 This is the USB_OTG_HS_PORTSC register.

下面是对第11 ,12bit的说明

Line status
Read-only
These bits reflect the current logical levels of the D+ (bit 11)
and D- (bit 10) signal lines:
00: SE0
10: J-state
01: K-state
11: Undefined
In the host mode, the use of linestate by the host controller
driver is not necessary (unlike EHCI), because the port
controller state machine and the port routing manage the
connection of LS and FS.
In the device mode, the use of linestate by the device controller
driver is not necessary.
可见当[12,11]=11时,是wall charge,否则是host charge。

以上本质都是读寄存器,一定要分清哪些是硬件实现,哪些是软件实现,寄存器参考80-VM299-2 MSM7227-MSM7227-1 MOBILE STATION MODEM SOFTWARE INTERFACE.pdf。

要理解USB,得先掌握些理论上的东西,如device mode,host mode,A-device B-device,OTG(脱离PC,两个外设传输数据)等等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值