Android驱动分析

作者: 60916fc63567 | 来源:发表于2016-09-12 10:22 被阅读127次

    一、USB驱动代码架构和使用

    1、代码简介

    USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c,f_adb.c,

    f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于

    f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。

    可在android.c中看到:

    static int __init android_bind_config(struct usb_configuration *c)

    {

    struct android_dev *dev = _android_dev;

    int ret;

    printk(KERN_DEBUG "android_bind_config\n");

    ret = mass_storage_function_add(dev->cdev, c, dev->nluns);

    if (ret)

    return ret;

    return adb_function_add(dev->cdev, c);

    }

    2、驱动使用

    要使USB mass storage连接到主机:

    打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向file文件写入一个存储

    设备的路径,例如/dev/block/vold/179:0 (major:minor)路径;

    这里的usb_mass_storage根据实际应用可以改的,由platform_device_register函数的参数决

    定。

    例如:

    static struct platform_device fsg_platform_device =

    {

    .name = "usb_mass_storage",

    .id  = -1,

    };

    static void __init tegra_machine_init(void)

    {

    ....

    (void) platform_device_register(&fsg_platform_device);

    ....

    }

    能够连接的设备数,由驱动中的nluns变量来控制,最多支持8个。

    二、USB插入检测

    三、USB代码分析

    1、USB初始化

    在android.c中分别注册adb和mass storage:

    static int __init android_bind_config(struct usb_configuration *c)

    {

    struct android_dev *dev = _android_dev;

    int ret;

    printk(KERN_DEBUG "android_bind_config\n");

    ret = mass_storage_function_add(dev->cdev, c, dev->nluns);

    if (ret)

    return ret;

    return adb_function_add(dev->cdev, c);

    }

    2、往驱动写入lun信息

    在驱动中有static DEVICE_ATTR(file, 0444, show_file, store_file);这是负责读

    (cat/read)或直写(echo/write)设备属性文件的宏。

    3、USB连接到主机

    echo /dev/block/vold/179:0 > /sys/devices/platform/usb_mass_storage/lun0/file

    4、USB从主机断开

    echo "" > /sys/devices/platform/usb_mass_storage/lun0/file

    相关文章

      网友评论

        本文标题:Android驱动分析

        本文链接:https://www.haomeiwen.com/subject/ewrpettx.html