hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/sh
#
# setup configfs for adbd, usb mass storage and MTP....
# For kernel v4.4 usb configfs
#
 
UAC=uac2
 
USB_ATTRIBUTE=0x409
USB_GROUP=rockchip
USB_SKELETON=b.1
 
CONFIGFS_DIR=/sys/kernel/config
USB_CONFIGFS_DIR=${CONFIGFS_DIR}/usb_gadget/${USB_GROUP}
USB_STRINGS_DIR=${USB_CONFIGFS_DIR}/strings/${USB_ATTRIBUTE}
USB_FUNCTIONS_DIR=${USB_CONFIGFS_DIR}/functions
USB_CONFIGS_DIR=${USB_CONFIGFS_DIR}/configs/${USB_SKELETON}
 
function_init()
{
   mkdir ${USB_FUNCTIONS_DIR}/${UAC}.gs0
}
 
configfs_init()
{
   echo "Debug: configfs_init"
   mkdir /dev/usb-ffs
 
   mount -t configfs none ${CONFIGFS_DIR}
   mkdir ${USB_CONFIGFS_DIR} -m 0770
   echo 0x2207 > ${USB_CONFIGFS_DIR}/idVendor
   echo 0x0310 > ${USB_CONFIGFS_DIR}/bcdDevice
   echo 0x0200 > ${USB_CONFIGFS_DIR}/bcdUSB
   mkdir ${USB_STRINGS_DIR}   -m 0770
   SERIAL=`cat /proc/cpuinfo | grep Serial | awk '{print $3}'`
   if [ -z $SERIAL ];then
       SERIAL=0123456789ABCDEF
   fi
   echo $SERIAL > ${USB_STRINGS_DIR}/serialnumber
   echo "rockchip"  > ${USB_STRINGS_DIR}/manufacturer
   echo "rv1109"  > ${USB_STRINGS_DIR}/product
 
   function_init
 
   mkdir ${USB_CONFIGS_DIR}  -m 0770
   mkdir ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}  -m 0770
}
 
parameter_init()
{
   if [ "$UAC" == "uac2" ]; then
       CONFIG_STRING=uac2
       echo "parameter_init ${CONFIG_STRING}"
   elif [ "$UAC" == "uac1" ];then
       CONFIG_STRING=uac1
       echo "parameter_init ${CONFIG_STRING}"
   else
       echo "parameter_init ${UAC} is invalid"
   fi
}
 
config_init()
{
   UAC_GS0=${USB_FUNCTIONS_DIR}/${UAC}.gs0
   echo 3 > ${UAC_GS0}/p_chmask
   echo 2 > ${UAC_GS0}/p_ssize
   echo 8000,16000,44100,48000 > ${UAC_GS0}/p_srate
        echo 1 > ${UAC_GS0}/p_feature_unit
 
   echo 3 > ${UAC_GS0}/c_chmask
   echo 2 > ${UAC_GS0}/c_ssize
   echo 8000,16000,44100,48000 > ${UAC_GS0}/c_srate
   echo 1 > ${UAC_GS0}/c_feature_unit
}
 
syslink_function()
{
   ln -s ${USB_FUNCTIONS_DIR}/$1 ${USB_CONFIGS_DIR}/f${USB_FUNCTIONS_CNT}
   let USB_FUNCTIONS_CNT=USB_FUNCTIONS_CNT+1
}
 
bind_functions()
{
   USB_FUNCTIONS_CNT=1
 
   if [ "$UAC" == "uac2" ]; then
       syslink_function uac2.gs0
   elif [ "$UAC" == "uac1" ];then
       syslink_function uac1.gs0
   else
       echo "parameter_init ${UAC} is invalid"
   fi
 
   echo ${CONFIG_STRING} > ${USB_CONFIGS_DIR}/strings/${USB_ATTRIBUTE}/configuration
}
 
program_kill()
{
   P_PID=`ps | grep $1 | grep -v grep | awk '{print $1}'`
   test -z ${P_PID} || kill -9 ${P_PID}
}
 
usb_device_stop()
{
   echo "none" > ${USB_CONFIGFS_DIR}/UDC
   program_kill adbd
   program_kill mtp-server
   ls ${USB_CONFIGS_DIR} | grep f[0-9] | xargs -I {} rm ${USB_CONFIGS_DIR}/{}
}
 
case "$1" in
start)
    echo "usb_config in $1"
   DIR=$(cd `dirname $0`; pwd)
   parameter_init
   if [ -z $CONFIG_STRING ]; then
       echo "$0: no function be selected"
       exit 0
   fi
   test -d ${USB_CONFIGFS_DIR} || configfs_init
   echo 0x0019 > ${USB_CONFIGFS_DIR}/idProduct
   config_init
   bind_functions
   sleep 1
   UDC=`ls /sys/class/udc/| awk '{print $1}'`
   echo $UDC > ${USB_CONFIGFS_DIR}/UDC
   ;;
stop)
   usb_device_stop
   ;;
restart|reload)
   # Do restart usb by udev
   echo "USB_FORCE_CHANGED" >> /tmp/.usb_config
   usb_device_stop
   sleep 1
   $0 start
   # Don't forget to clear "USB_FORCE_CHANGED"
   sed -i "/USB_FORCE_CHANGED/d" /tmp/.usb_config
   ;;
*)
   echo "Usage: $0 {start|stop|restart}"
   exit 1
esac
 
exit 0