summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-graphics/obmc-ikvm/obmc-ikvm/create_usbhid.sh
blob: 955f18b61f235dac8c9f4fe982b08e878b3aebd7 (plain)
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
#!/bin/sh

new_directory="/sys/kernel/config/usb_gadget/obmc_input"

if [ -e "${new_directory}" ]; then
	exit 0
fi

# create gadget
original_directory="$(pwd)"
mkdir "${new_directory}"
cd "${new_directory}"

# add basic information
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
echo 0x0104 > idProduct		# Multifunction Composite Gadget
echo 0x1d6b > idVendor		# Linux Foundation

# create English locale
mkdir strings/0x409

echo "OpenBMC" > strings/0x409/manufacturer
echo "virtual_input" > strings/0x409/product
echo "OBMC0001" > strings/0x409/serialnumber

# Create HID keyboard function
mkdir functions/hid.0

echo 1 > functions/hid.0/protocol	# 1: keyboard
echo 8 > functions/hid.0/report_length
echo 1 > functions/hid.0/subclass

# Binary HID keyboard descriptor
#  0x05, 0x01, // USAGE_PAGE (Generic Desktop)
#  0x09, 0x06, // USAGE (Keyboard)
#  0xa1, 0x01, // COLLECTION (Application)
#  0x05, 0x07, //   USAGE_PAGE (Keyboard)
#  0x19, 0xe0, //   USAGE_MINIMUM (Keyboard LeftControl)
#  0x29, 0xe7, //   USAGE_MAXIMUM (Keyboard Right GUI)
#  0x15, 0x00, //   LOGICAL_MINIMUM (0)
#  0x25, 0x01, //   LOGICAL_MAXIMUM (1)
#  0x75, 0x01, //   REPORT_SIZE (1)
#  0x95, 0x08, //   REPORT_COUNT (8)
#  0x81, 0x02, //   INPUT (Data,Var,Abs)
#  0x95, 0x01, //   REPORT_COUNT (1)
#  0x75, 0x08, //   REPORT_SIZE (8)
#  0x81, 0x03, //   INPUT (Data,Var,Abs)
#  0x95, 0x05, //   REPORT_COUNT (5)
#  0x75, 0x01, //   REPORT_SIZE (1)
#  0x05, 0x08, //   USAGE_PAGE (LEDs)
#  0x19, 0x01, //   USAGE_MINIMUM (Num Lock)
#  0x29, 0x05, //   USAGE_MAXIMUM (Kana)
#  0x91, 0x02, //   OUTPUT (Data,Var,Abs)
#  0x95, 0x01, //   REPORT_COUNT (1)
#  0x75, 0x03, //   REPORT_SIZE (3)
#  0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)
#  0x95, 0x06, //   REPORT_COUNT (6)
#  0x75, 0x08, //   REPORT_SIZE (8)
#  0x15, 0x00, //   LOGICAL_MINIMUM (0)
#  0x25, 0x65, //   LOGICAL_MAXIMUM (101)
#  0x05, 0x07, //   USAGE_PAGE (Keyboard)
#  0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))
#  0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)
#  0x81, 0x00, //   INPUT (Data,Ary,Abs)
#  0xc0        // END_COLLECTION
echo -ne '\x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x03\x95\x05\x75\x01\x05\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x03\x95\x06\x75\x08\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00\xc0' > functions/hid.0/report_desc

# Create HID mouse function
mkdir functions/hid.1

echo 2 > functions/hid.1/protocol	# 2: mouse
echo 5 > functions/hid.1/report_length
echo 1 > functions/hid.1/subclass

# Binary HID mouse descriptor (absolute coordinate)
#  0x05, 0x01,       // USAGE_PAGE (Generic Desktop)
#  0x09, 0x02,       // USAGE (Mouse)
#  0xa1, 0x01,       // COLLECTION (Application)
#  0x09, 0x01,       //   USAGE (Pointer)
#  0xa1, 0x00,       //   COLLECTION (Physical)
#  0x05, 0x09,       //     USAGE_PAGE (Button)
#  0x19, 0x01,       //     USAGE_MINIMUM (Button 1)
#  0x29, 0x03,       //     USAGE_MAXIMUM (Button 3)
#  0x15, 0x00,       //     LOGICAL_MINIMUM (0)
#  0x25, 0x01,       //     LOGICAL_MAXIMUM (1)
#  0x95, 0x03,       //     REPORT_COUNT (3)
#  0x75, 0x01,       //     REPORT_SIZE (1)
#  0x81, 0x02,       //     INPUT (Data,Var,Abs)
#  0x95, 0x01,       //     REPORT_COUNT (1)
#  0x75, 0x05,       //     REPORT_SIZE (5)
#  0x81, 0x03,       //     INPUT (Cnst,Var,Abs)
#  0x05, 0x01,       //     USAGE_PAGE (Generic Desktop)
#  0x09, 0x30,       //     USAGE (X)
#  0x09, 0x31,       //     USAGE (Y)
#  0x35, 0x00,       //     PHYSICAL_MINIMUM (0)
#  0x46, 0xff, 0x7f, //     PHYSICAL_MAXIMUM (32767)
#  0x15, 0x00,       //     LOGICAL_MINIMUM (0)
#  0x26, 0xff, 0x7f, //     LOGICAL_MAXIMUM (32767)
#  0x65, 0x11,       //     UNIT (SI Lin:Distance)
#  0x55, 0x00,       //     UNIT_EXPONENT (0)
#  0x75, 0x10,       //     REPORT_SIZE (16)
#  0x95, 0x02,       //     REPORT_COUNT (2)
#  0x81, 0x02,       //     INPUT (Data,Var,Abs)
#  0xc0,             //   END_COLLECTION
#  0xc0              // END_COLLECTION
echo -ne '\x05\x01\x09\x02\xa1\x01\x09\x01\xa1\x00\x05\x09\x19\x01\x29\x03\x15\x00\x25\x01\x95\x03\x75\x01\x81\x02\x95\x01\x75\x05\x81\x03\x05\x01\x09\x30\x09\x31\x35\x00\x46\xff\x7f\x15\x00\x26\xff\x7f\x65\x11\x55\x00\x75\x10\x95\x02\x81\x02\xc0\xc0' > functions/hid.1/report_desc

# Create configuration
mkdir configs/c.1
mkdir configs/c.1/strings/0x409

echo 0x80 > configs/c.1/bmAttributes
echo 200 > configs/c.1/MaxPower
echo "" > configs/c.1/strings/0x409/configuration

# Link HID functions to configuration
ln -s functions/hid.0 configs/c.1
ln -s functions/hid.1 configs/c.1

# Enable gadget
dev_name="1e6a0000.usb-vhub"
i=0
num_ports=5
base_usb_dir="/sys/bus/platform/devices/${dev_name}/${dev_name}:p"
while [ $i -lt $num_ports ]; do
	port=$(($i + 1))
	i=$port
	if [ ! -e "${base_usb_dir}${port}/gadget/suspended" ]; then
		break
	fi
done
echo "${dev_name}:p${port}" > UDC

cd "${original_directory}"