1.一個config_item 是通過顯式用戶空間mkdir操作創建的,通過rmdir銷毀。屬性(文件)在mkdir之后出現,可以通過read和write讀取或修改屬性文件。與sysfs一樣,readdir查詢鏈表上的items和/或attributes。
2.symlink可用於將items組合在一起。 與sysfs不同,表示的生命周期完全由用戶空間驅動,支持這items的內核模塊必須響應這一點。
3.平台A上是在init.rc文件中掛載的
mount configfs none /config
在init.recovery.BOARD.rc文件中在adb初始化好后將 setprop sys.usb.configfs 1
注意persist.sys.usb.config屬性:# getprop persist.sys.usb.config mobile_link,adb
4.查看USB相關的屬性:# getprop |grep usb
5.這些使用configfs作為subsystems注冊其item types的模塊稱為客戶端模塊。一旦加載了client subsystem后,它將顯示為/config下的子目錄(或多個子目錄)。
6.通過mkdir創建一個item。 該item的屬性(文件)也將在這個時候出現。
7.當需要銷毀某個項目時,請使用rmdir將其刪除。 如果一個item存在任何其他鏈接,則無法銷毀該項目。 可以通過unlink刪除鏈接。
8.configfs中的每個對象都是一個config_item。 一個config_item反映了此子系統中的一個對象
9.group是共享相同屬性和操作的項的集合。 Items由mkdir創建並由rmdir刪除,但configfs處理它, 該group具有一組執行這些任務的操作。
10.在初始化期間,客戶端模塊注冊子系統到configfs,子系統顯示為configfs文件系統下的頂級的目錄。 一個子系統也是一個config_group,可以完成config_group所能做的一切。
11.config_item的所有用戶都應該通過config_item_get()來引用它,並在引用完成時通過config_item_put()刪除引用。
12.config_item_type指定config_item的行為,提供操作函數。
13.動態分配的所有項items都需要提供ct_item_ops->release()方法釋放。 當config_item的引用計數達到零時,將調用此方法。
14.當config_item希望某個屬性在項目的configfs目錄中顯示為文件時,它必須定義一個configfs_attribute來描述它
15.config_item無法憑空存在,config_group上的mkdir是創建它的唯一方法。 這將觸發子項目的創建。
16.正確配置該項目意味着一個組可以作為一個項目本身(也即一個config_group本身也是一個config_item)。 但是,它可以做更多:它可以創建子項或組。這是通過組的config_item_type上指定的組操作完成的。
17.當調用rmdir時,configfs將從文件系統樹中刪除該項(假設它沒有子節點來保持它忙)。 子系統負責響應這一點。 如果子系統在其它線程中對該項目具有引用,則內存是安全的(引用計數保證的).
項目實際上可能需要一些時間才能從子系統的使用中消失。 但它已經從configfs中消失了。
18.當rmdir --> drop_item()被調用時,項目的鏈接已被拆除。它不再具有對其父級的引用,並且在項目層次結構中沒有位置了。 如果客戶端在拆除發生之前需要進行一些清理工作,則子系統可以實
現configfs_group_operations.disconnect_notify()方法。 這個方法將會在configfs將此項目從文件系統視圖中移除之后,但在從其父group中刪除之前調用。
19.一個子系統永遠不會觸及文件系統部分,但子系統可能對此層次結構感興趣。
20.configfs構建出一個層次結構,層次結構通過config_group->cg_children和config_item->ci_parent構成樹狀結構。子系統可以導航cg_children列表和ci_parent指針以查看子系統創建的樹。
這可能與configfs管理層次結構競爭,因此configfs使用子系統互斥鎖來保護修改。 每當子系統想要導航層次結構時,它必須在子系統互斥鎖的保護下這樣做。
當新分配的項尚未鏈接到此層次結構時,將阻止子系統獲取互斥鎖。 同樣,當丟棄的項目尚未取消鏈接時,它不可以獲取互斥鎖。 這意味着當項目在configfs中時,項目的ci_parent指針永
遠不會為NULL,並且項目將僅在其父項的cg_children列表中持續相同的持續時間。 這允許子系統在保持互斥鎖時信任ci_parent和cg_children。
21.configfs通過group->item 父/子關系提供一個簡單的組。 但是,通常,較大的環境需要在父/子連接之外進行聚合,這是通過symlink實現的。
22.configfs提供了一種方法,可以在創建父項時在父項內自動創建一個或多個子組
23.如果ct_group_ops->make_group()存在,則其他子組可以直接在父組上創建。
24.configfs子系統通過使用configfs_add_default_group()函數將它們添加到父config_group結構來指定默認的組。每個添加的組都在configfs樹中與父組一起填充。同樣,它們與父母同時被刪除。
沒有提供額外的通知。當 ->drop_item()方法調用通知子系統父組將要被移除時,它還意味着與該父組關聯的每個默認組子項。因此,默認組無法通過rmdir直接刪除。 #######??########
========================
25.使用configfs需要選中CONFIGFS_FS,它又被USB_LIBCOMPOSITE select了。
26.configfs中的items和groups都顯示為目錄。items和groups的區別是groups還可以包含其它group。group和item都可以有屬性文件
greoup:
---------------------------------------
/config/usb_gadget/g1
/config/usb_gadget/g1/configs
/config/usb_gadget/g1/functions
/config/usb_gadget/g1/strings
/config/usb_gadget/g1/configs/b.1
/config/usb_gadget/g1/configs/b.1/strings
item:
---------------------------------------
/config/usb_gadget/g1/os_desc
/config/usb_gadget/g1/configs/b.1/strings/0x409
/config/usb_gadget/g1/configs/b.1/strings/0x409
/config/usb_gadget/g1/functions/eap.mobilelink
/config/usb_gadget/g1/functions/iap.mobilelink
/config/usb_gadget/g1/functions/ncm.mobilelink
27.可以刪除目錄,但是不可以刪除屬性文件!!!
28.對confifs中的屬性文件進行寫操作,寫的內容將被保存在合適的位置。
29.用戶通過configfs創建configurations和functions,然后在configurations中
創建符號鏈接到functions。上面的這些信息在向UDC屬性文件中寫入udc_name時使用,
因為此時會觸發gadget driver與gadget device的綁定的操作。
drivers/usb/gadget/configfs.c中的代碼會遍歷所有的configurations,對於每個配置都遍歷其下的functions
然后進行綁定。
======>有兩個bind,1是gadget驅動bind UDC,另一個是function bind配置。
30.drivers/usb/gadget/configfs.c做了下列事情
- gadget's config_group
- gadget's default groups (configs, functions, strings)
- associating functions with configurations (symlinks)
31.usb_get_function_instance()后調用equest_module(),它會觸發用戶空間的modprobe加載對應的function的驅動文件。但是當gadget被disable后這些已經加載的function驅動不會自動卸載。
32. alias ls="ls --color=auto" 可以使串口終端輸出帶顏色
33.很經典的描述:
--------------------------------------
1.A gadget is seen by its host as a set of configurations., each of which contains a number of interfaces, which from the gadget's perspective, are known as functions,
each function representing e.g. a serial connection or a SCSI disk.
2.Creating a gadget means deciding what configurations there will be and which functions each configuration will provide.
3.Configfs lends itself nicely for the purpose of telling the kernel about the above mentioned decision.
34.cofigfs中對應函數調用時機
mkdir時調用configfs_group_operations.make_item()
rmdir時調用configfs_group_operations.drop_item()
symlink時如果ct_item_ops->allow_link()方法存在,則可以使用config_item作為鏈接的源調用symlink, 這些鏈接僅在configfs的config_items之間被允許。 #######################
unlink時在符號鏈接上調用unlink()時,源項為通過ct_item_ops->drop_link()方法被通知。
/config/usb_gadget/g1 # ls
UDC bDeviceSubClass bcdUSB idProduct strings
bDeviceClass bMaxPacketSize0 configs idVendor
bDeviceProtocol bcdDevice functions os_desc
/config/usb_gadget/g1 # ls configs/
b.1
/config/usb_gadget/g1 # ls configs/b.1/
MaxPower bmAttributes f1 f2 f3 f4 f5 strings
/config/usb_gadget/g1 # ls strings/
0x409
/config/usb_gadget/g1 # ls functions/ -l
total 0
drwxr-xr-x 2 shell shell 0 2016-12-31 23:50 eap.mobilelink
drwxr-xr-x 2 shell shell 0 2016-12-31 23:50 eap_carbit.mobilelink
drwxr-xr-x 2 shell shell 0 2016-12-31 23:50 eap_welink.mobilelink
drwxr-xr-x 2 root root 0 2016-12-31 23:50 ffs.adb
drwxr-xr-x 2 shell shell 0 2016-12-31 23:50 iap.mobilelink
drwxr-xr-x 2 shell shell 0 2016-12-31 23:50 ncm.mobilelink
/config/usb_gadget/g1 # ls strings/0x409/
manufacturer product serialnumber
/config/usb_gadget/g1 # ls configs/b.1/ -l
total 0
-rw-r--r-- 1 root root 4096 2016-12-31 23:50 MaxPower
-rw-r--r-- 1 root root 4096 2017-01-01 00:05 bmAttributes
lrwxrwxrwx 1 root root 0 2016-12-31 23:50 f1 -> ../../../../usb_gadget/g1/functions/iap.mobilelink
lrwxrwxrwx 1 root root 0 2016-12-31 23:50 f2 -> ../../../../usb_gadget/g1/functions/ncm.mobilelink
lrwxrwxrwx 1 root root 0 2016-12-31 23:50 f3 -> ../../../../usb_gadget/g1/functions/eap.mobilelink
lrwxrwxrwx 1 root root 0 2016-12-31 23:50 f4 -> ../../../../usb_gadget/g1/functions/eap_carbit.mobilelink
lrwxrwxrwx 1 root root 0 2016-12-31 23:50 f5 -> ../../../../usb_gadget/g1/functions/ffs.adb
drwxr-xr-x 3 root root 0 2016-12-31 23:50 strings
/config/usb_gadget/g1 # ls os_desc/
b_vendor_code qw_sign use
35.configfs使用步驟:
===============================================
1.掛載configfs
$ mount none /config -t configfs
2.創建一個gadget
$ mkdir /config/usb_gadget/g1
$ cd /config/usb_gadget/g1
[@/config/usb_gadget/g1]$ echo <VID> > idVendor
[@/config/usb_gadget/g1]$ echo <PID> > idProduct
[@/config/usb_gadget/g1]$ mkdir strings/0x409
[@/config/usb_gadget/g1]$ echo <serial number> > strings/0x409/serialnumber
[@/config/usb_gadget/g1]$ echo <manufacturer> > strings/0x409/manufacturer
[@/config/usb_gadget/g1]$ echo <product> > strings/0x409/product
3.創建configs
[@/config/usb_gadget/g1]$ mkdir configs/<name>.<number> #<name>表示gadget設備名,可以是任意字符串,<number>是configure ID,eg: mkdir configs/c.1 #1號配置
[@/config/usb_gadget/g1]$ echo 120 > configs/c.1/MaxPower #可以配置1號配置的內部的一些參數
4.創建functions
[@/config/usb_gadget/g1]$ mkdir functions/<name>.<instance name> #和配置的目錄是在同一級目錄下,eg:mkdir functions/iap.mobilelink name為iap, instance name為mobilelink ===>TODO: 這兩個name有什么區別??
注意:<instance name> 是文件系統允許的任意字符串,mkdir創建config_item
5.將function和configs進行關聯
[@/config/usb_gadget/g1]$ ln -s functions/<name>.<instance name> configs/<name>.<number>/fx #Android中創建符號鏈接使用的不是ln
注意:一個function可以被多個configuration使用,Android中使用的是symlink創建的軟鏈接
參考配置如下:
symlink /config/usb_gadget/g1/functions/iap.mobilelink /config/usb_gadget/g1/configs/b.1/f1
symlink /config/usb_gadget/g1/functions/ncm.mobilelink /config/usb_gadget/g1/configs/b.1/f2
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3
write /config/usb_gadget/g1/UDC ${sys.usb.controller}
顯示為:
/config # busybox ls --color /config/usb_gadget/g1/configs/b.1/ -l <
total 0
-rw-r--r-- 1 0 0 4096 Dec 31 15:50 MaxPower
-rw-r--r-- 1 0 0 4096 Dec 31 16:07 bmAttributes
lrwxrwxrwx 1 0 0 0 Dec 31 15:50 f1 -> ../../../../usb_gadget/g1/functions/iap.mobilelink
lrwxrwxrwx 1 0 0 0 Dec 31 15:50 f2 -> ../../../../usb_gadget/g1/functions/ncm.mobilelink
lrwxrwxrwx 1 0 0 0 Dec 31 15:50 f3 -> ../../../../usb_gadget/g1/functions/eap.mobilelink
lrwxrwxrwx 1 0 0 0 Dec 31 15:50 f4 -> ../../../../usb_gadget/g1/functions/eap_carbit.mobilelink
lrwxrwxrwx 1 0 0 0 Dec 31 15:50 f5 -> ../../../../usb_gadget/g1/functions/ffs.adb
drwxr-xr-x 3 0 0 0 Dec 31 15:50 strings
/config #
7.使能gadget
[@/config/usb_gadget/g1]$ echo <udc name> > UDC
如果gadget設備沒有被使能,那么USB host就不能枚舉它。通過綁定UDC才能使能gadget. udc name可以查找位置:/sys/class/udc
8.失能gadget
[@/config/usb_gadget/g1]$ echo "" > UDC
9.清理操作
a.將functions從configurations里面移除
[@/config/usb_gadget/g1]$ rm configs/<config name>.<number>/<function>
eg :
[@/config/usb_gadget/g1]$ rm /config/usb_gadget/g1/configs/b.1/f4 # 刪除的是軟鏈接
b.刪除configurations下的strings目錄
Remove strings directories in configurations
eg:
[@/config/usb_gadget/g1]$ rmdir configs/c.1/strings/0x409 # A平台上這個沒有做
c.刪除configurations
[@/config/usb_gadget/g1]$ rmdir configs/<config name>.<number>
eg:
rmdir configs/c.1
d.移除functions
[@/config/usb_gadget/g1]$ rmdir functions/<name>.<instance name>
eg:
$ rmdir functions/eap.mobilelink
注意:盡管functions是被移除了,但是加載的模塊還是沒有被卸載的。
e.刪除gadget下的strings目錄
[@/config/usb_gadget/g1]$ rmdir strings/<lang>
eg:
$ rmdir strings/0x409
f.最后刪除gadget目錄
[@/config/usb_gadget/g1]$ cd ..
[@/config/usb_gadget]$ rmdir <gadget name>
eg:
$ rmdir g1