Android USB 驅動分析與開發----程式設計
阿新 • • 發佈:2019-01-10
一、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
裝置初始化:
/kernel/arch/arm/mach-msm/board-msmxxxx.c
USB驅動檔案檔案:
/kernel/drivers/usb/gadget/android.c-------複合裝置,所有的f開頭的介面裝置向android.c註冊,由android.c控制enable/disable
/kernel/drivers/usb/gadget/f_mass_storage.c--------cd rom/u盤裝置,由cdrom引數控制,如果為1上報cdrom,否則上報u盤。
/kernel/drivers/usb/gadget/f_ecm.c--------ecm網路裝置,裝置側列舉為usb0
/kernel/drivers/usb/gadget/f_adb.c--------adb驅動
/kernel/drivers/usb/gadget/f_serial.c--------比較常用和通用的一個驅動程式,可以枚舉出一個ttyGS*的裝置在裝置側,它可以作為診斷口,modem口,at口來使用。
/kernel/drivers/usb/gadget/f_diag.c--------診斷口,msm7x27a作為一個雙cpu共享外設的soc,這個口比較特別,還沒有來得及瞭解。
/kernel/drivers/usb/gadget/f_rndis.c--------remotendis裝置驅動。Rndis不同於ecm驅動,它需要固定的佔據interface 0和interface1兩個介面,否則無法正常工作,但rndis的優勢也是明顯的,在windows下,它可以實現“免驅”,vista以後,裝置上報rndis型別介面,可以不用寫pc側驅動程式。
驅動parameter設定:
Static intset_pid(const char *val, struct kernel_param *kp);
Static intget_pid(char *buffer, struct kernel_param *kp);
Module_param_call(product_id,set_pid,get_pid);
MODULE_PARM_DESC(product_id,”USBdevice product id”);
為module android(android.c)增加一個parameter,通過讀取這個parameter,獲取當前android複合裝置採用的是哪一個pid,通過設定pid,可以達到重新列舉usb複合裝置,使用不同的功能組合。如pid:1000對應rndis,pid:1001對應rndis+u盤。
增加完以後,我們會看到多出一個/sys/module/android/parameters/ product_id的檔案。
檢視當前的裝置pid:cat/sys/module/android/parameters/g_product_id
設定當前的裝置pid:echo 9024> /sys/module/android/parameters/g_product_id
裝置屬性設定:
通過增加裝置屬性,可以達到裝置的靈活配置,為f_mass_storage增加一個cdrom和description的裝置屬性,第一個用於將裝置配置成為cdrom和光碟;第二個用於配置裝置描述符,8+16+4個字元組成,用於裝置的描述符。
StaticDEVICE_ATTR(cdrom,0644,fsg_show_cdrom,fsg_store_cdrom);
Rc=device_create_file(&curlun->dev,&dev_attr_cdrom);
增加完以後,我們會看到多出一個/sys/devices/platform/usb_mass_storage/lun0/cdrom檔案,
設定當前的裝置的cdrom屬性為1—光碟:
echo 1>/sys/devices/platform/usb_mass_storage/lun0/cdrom
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
裝置初始化:
/kernel/arch/arm/mach-msm/board-msmxxxx.c
USB驅動檔案檔案:
/kernel/drivers/usb/gadget/android.c-------複合裝置,所有的f開頭的介面裝置向android.c註冊,由android.c控制enable/disable
/kernel/drivers/usb/gadget/f_mass_storage.c--------cd
/kernel/drivers/usb/gadget/f_ecm.c--------ecm網路裝置,裝置側列舉為usb0
/kernel/drivers/usb/gadget/f_adb.c--------adb驅動
/kernel/drivers/usb/gadget/f_serial.c--------比較常用和通用的一個驅動程式,可以枚舉出一個ttyGS*的裝置在裝置側,它可以作為診斷口,modem口,at口來使用。
/kernel/drivers/usb/gadget/f_diag.c--------診斷口,msm7x27a作為一個雙cpu共享外設的soc,這個口比較特別,還沒有來得及瞭解。
/kernel/drivers/usb/gadget/f_rndis.c--------remotendis裝置驅動。Rndis不同於ecm驅動,它需要固定的佔據interface 0和interface1兩個介面,否則無法正常工作,但rndis的優勢也是明顯的,在windows下,它可以實現“免驅”,vista以後,裝置上報rndis型別介面,可以不用寫pc側驅動程式。
驅動parameter設定:
Static intset_pid(const char *val, struct kernel_param *kp);
Static intget_pid(char *buffer, struct kernel_param *kp);
Module_param_call(product_id,set_pid,get_pid);
MODULE_PARM_DESC(product_id,”USBdevice product id”);
為module android(android.c)增加一個parameter,通過讀取這個parameter,獲取當前android複合裝置採用的是哪一個pid,通過設定pid,可以達到重新列舉usb複合裝置,使用不同的功能組合。如pid:1000對應rndis,pid:1001對應rndis+u盤。
增加完以後,我們會看到多出一個/sys/module/android/parameters/ product_id的檔案。
檢視當前的裝置pid:cat/sys/module/android/parameters/g_product_id
設定當前的裝置pid:echo 9024> /sys/module/android/parameters/g_product_id
裝置屬性設定:
通過增加裝置屬性,可以達到裝置的靈活配置,為f_mass_storage增加一個cdrom和description的裝置屬性,第一個用於將裝置配置成為cdrom和光碟;第二個用於配置裝置描述符,8+16+4個字元組成,用於裝置的描述符。
StaticDEVICE_ATTR(cdrom,0644,fsg_show_cdrom,fsg_store_cdrom);
Rc=device_create_file(&curlun->dev,&dev_attr_cdrom);
增加完以後,我們會看到多出一個/sys/devices/platform/usb_mass_storage/lun0/cdrom檔案,
設定當前的裝置的cdrom屬性為1—光碟:
echo 1>/sys/devices/platform/usb_mass_storage/lun0/cdrom