SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
usb.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0+ */
3#ifndef __USB_H__
4#define __USB_H__
6#include "reg/reg-usb.h"
8/*
9 * Descriptor types
10 */
11#define USB_DT_DEVICE 0x01
12#define USB_DT_CONFIG 0x02
13#define USB_DT_STRING 0x03
14#define USB_DT_INTERFACE 0x04
15#define USB_DT_ENDPOINT 0x05
16#define USB_DT_DEVICE_QUALIFIER 0x06
17
18#define USB_DT_HID (USB_TYPE_CLASS | 0x01)
19#define USB_DT_REPORT (USB_TYPE_CLASS | 0x02)
20#define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
21#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
22
23/*
24 * Descriptor sizes per descriptor type
25 */
26#define USB_DT_DEVICE_SIZE 18
27#define USB_DT_CONFIG_SIZE 9
28#define USB_DT_INTERFACE_SIZE 9
29#define USB_DT_ENDPOINT_SIZE 7
30#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
31#define USB_DT_HUB_NONVAR_SIZE 7
32#define USB_DT_HID_SIZE 9
33
40
41/*
42 * standard usb descriptor structures
43 */
52
64
75
92
105
111
117
125
126typedef struct sunxi_udc {
128 uint32_t address; /* device address, allocated by the host */
129 uint32_t speed; /* flag: is it high speed? */
130 uint32_t bulk_ep_max; /* maximum packet size for bulk endpoints */
131 uint32_t fifo_size; /* size of the FIFO */
138
139typedef struct sunxi_ubuf {
140 uint8_t *rx_base_buffer; /* base address for bulk transfer */
141 uint8_t *rx_req_buffer; /* buffer for the request phase of bulk transfer */
142 uint32_t rx_req_length; /* length of data in the request phase of bulk transfer */
143 uint32_t rx_ready_for_data; /* flag indicating completion of data reception */
144 uint32_t request_size; /* size of the data to be sent */
146
147typedef struct sunxi_usb_setup_req_s {
148 int (*state_init)(void);
149 int (*state_exit)(void);
150 void (*state_reset)(void);
151 int (*standard_req_op)(uint32_t cmd, struct usb_device_request *req, uint8_t *buffer);
152 int (*nonstandard_req_op)(uint32_t cmd, struct usb_device_request *req, uint8_t *buffer, uint32_t data_status);
153 int (*state_loop)(void *sunxi_udc);
154 void (*dma_rx_isr)(void *p_arg);
155 void (*dma_tx_isr)(void *p_arg);
157
158#define SUNXI_USB_DEVICE_DETECT (1)
159#define SUNXI_USB_DEVICE_MASS (2)
160
161#define sunxi_usb_module_init(name, state_init, state_exit, state_reset, standard_req_op, nonstandard_req_op, state_loop, dma_rx_isr, dma_tx_isr) \
162 sunxi_usb_setup_req_t setup_req_##name = {state_init, state_exit, state_reset, standard_req_op, nonstandard_req_op, state_loop, dma_rx_isr, dma_tx_isr};
163
164#define sunxi_usb_module_reg(name) sunxi_udev_active = &setup_req_##name
165
166#define sunxi_usb_module_ext(name) extern sunxi_usb_setup_req_t setup_req_##name
167
168/* export usb module */
171
172/* USB IO Wrzpper */
173#define usb_get_bit8(bp, reg) (read8(reg) & (1 << (bp)))
174#define usb_get_bit16(bp, reg) (read16(reg) & (1 << (bp)))
175#define usb_get_bit32(bp, reg) (read32(reg) & (1 << (bp)))
176
177#define usb_set_bit8(bp, reg) (write8((reg), (read8(reg) | (1 << (bp)))))
178#define usb_set_bit16(bp, reg) (write16((reg), (read16(reg) | (1 << (bp)))))
179#define usb_set_bit32(bp, reg) (write32((reg), (read32(reg) | (1 << (bp)))))
180
181#define usb_clear_bit8(bp, reg) (write8((reg), (read8(reg) & (~(1 << (bp))))))
182#define usb_clear_bit16(bp, reg) (write16((reg), (read16(reg) & (~(1 << (bp))))))
183#define usb_clear_bit32(bp, reg) (write32((reg), (read32(reg) & (~(1 << (bp))))))
184
185/* Error Codes */
186#define SUNXI_USB_REQ_SUCCESSED (0)
187#define SUNXI_USB_REQ_DEVICE_NOT_SUPPORTED (-1)
188#define SUNXI_USB_REQ_UNKNOWN_COMMAND (-2)
189#define SUNXI_USB_REQ_UNMATCHED_COMMAND (-3)
190#define SUNXI_USB_REQ_DATA_HUNGRY (-4)
191#define SUNXI_USB_REQ_OP_ERR (-5)
192
207void sunxi_usb_attach_module(uint32_t device_type);
208
222int sunxi_usb_init();
223
234void sunxi_usb_dump(uint32_t usbc_base, uint32_t ep_index);
235
245void sunxi_usb_ep_reset();
246
257void sunxi_usb_irq();
258
271void sunxi_usb_attach();
272
283
310
322int sunxi_usb_start_recv_by_dma(void *mem_base, uint32_t length);
323
335void sunxi_usb_send_setup(uint32_t length, void *buffer);
336
348
360int sunxi_usb_send_data(void *buffer, uint32_t buffer_size);
361
369int sunxi_usb_get_ep_max(void);
370
379
388
389#endif// __USB_H__
u64_t uint64_t
Definition stdint.h:16
u32_t uint32_t
Definition stdint.h:13
u8_t uint8_t
Definition stdint.h:7
u16_t uint16_t
Definition stdint.h:10
Definition usb.h:139
uint32_t rx_req_length
Definition usb.h:142
uint8_t * rx_base_buffer
Definition usb.h:140
uint32_t request_size
Definition usb.h:144
uint8_t * rx_req_buffer
Definition usb.h:141
uint32_t rx_ready_for_data
Definition usb.h:143
Definition usb.h:126
uint32_t bulk_out_addr
Definition usb.h:133
uint32_t fifo_size
Definition usb.h:131
struct usb_device_request standard_reg
Definition usb.h:136
uint32_t dma_recv_channal
Definition usb.h:135
uint32_t speed
Definition usb.h:129
uint32_t dma_send_channal
Definition usb.h:134
uint32_t address
Definition usb.h:128
uint64_t usbc_hd
Definition usb.h:127
uint32_t bulk_in_addr
Definition usb.h:132
uint32_t bulk_ep_max
Definition usb.h:130
Definition usb.h:147
int(* nonstandard_req_op)(uint32_t cmd, struct usb_device_request *req, uint8_t *buffer, uint32_t data_status)
Definition usb.h:152
int(* state_loop)(void *sunxi_udc)
Definition usb.h:153
void(* state_reset)(void)
Definition usb.h:150
int(* state_init)(void)
Definition usb.h:148
int(* state_exit)(void)
Definition usb.h:149
int(* standard_req_op)(uint32_t cmd, struct usb_device_request *req, uint8_t *buffer)
Definition usb.h:151
void(* dma_tx_isr)(void *p_arg)
Definition usb.h:155
void(* dma_rx_isr)(void *p_arg)
Definition usb.h:154
Definition usb.h:65
uint8_t bmAttributes
Definition usb.h:72
uint16_t wTotalLength
Definition usb.h:68
uint8_t bDescriptorType
Definition usb.h:67
uint8_t bMaxPower
Definition usb.h:73
uint8_t bLength
Definition usb.h:66
uint8_t bNumInterfaces
Definition usb.h:69
uint8_t iConfiguration
Definition usb.h:71
uint8_t bConfigurationValue
Definition usb.h:70
Definition usb.h:76
uint16_t idVendor
Definition usb.h:84
uint8_t iSerialNumber
Definition usb.h:89
uint16_t bcdDevice
Definition usb.h:86
uint8_t bDeviceProtocol
Definition usb.h:82
uint8_t bNumConfigurations
Definition usb.h:90
uint16_t idProduct
Definition usb.h:85
uint16_t bcdUSB
Definition usb.h:79
uint8_t bDeviceClass
Definition usb.h:80
uint8_t bMaxPacketSize0
Definition usb.h:83
uint8_t iProduct
Definition usb.h:88
uint8_t iManufacturer
Definition usb.h:87
uint8_t bDescriptorType
Definition usb.h:78
uint8_t bDeviceSubClass
Definition usb.h:81
uint8_t bLength
Definition usb.h:77
Definition usb.h:118
uint8_t request
Definition usb.h:120
uint8_t request_type
Definition usb.h:119
uint16_t value
Definition usb.h:121
uint16_t index
Definition usb.h:122
uint16_t length
Definition usb.h:123
Definition usb.h:44
uint16_t wMaxPacketSize
Definition usb.h:49
uint8_t bEndpointAddress
Definition usb.h:47
uint8_t bInterval
Definition usb.h:50
uint8_t bmAttributes
Definition usb.h:48
uint8_t bDescriptorType
Definition usb.h:46
uint8_t bLength
Definition usb.h:45
Definition usb.h:112
uint8_t bDescriptorSubtype
Definition usb.h:115
uint8_t bDescriptorType
Definition usb.h:114
uint8_t bLength
Definition usb.h:113
Definition usb.h:53
uint8_t bInterfaceProtocol
Definition usb.h:61
uint8_t bNumEndpoints
Definition usb.h:58
uint8_t iInterface
Definition usb.h:62
uint8_t bDescriptorType
Definition usb.h:55
uint8_t bLength
Definition usb.h:54
uint8_t bAlternateSetting
Definition usb.h:57
uint8_t bInterfaceSubClass
Definition usb.h:60
uint8_t bInterfaceClass
Definition usb.h:59
uint8_t bInterfaceNumber
Definition usb.h:56
Definition usb.h:93
uint8_t bMaxPacketSize0
Definition usb.h:101
uint8_t bDeviceSubClass
Definition usb.h:99
uint8_t bLength
Definition usb.h:94
uint8_t breserved
Definition usb.h:103
uint8_t bDescriptorType
Definition usb.h:95
uint16_t bcdUSB
Definition usb.h:97
uint8_t bDeviceClass
Definition usb.h:98
uint8_t bNumConfigurations
Definition usb.h:102
uint8_t bDeviceProtocol
Definition usb.h:100
Definition usb.h:106
uint8_t bDescriptorType
Definition usb.h:108
uint8_t bLength
Definition usb.h:107
uint16_t wData[0]
Definition usb.h:109
int sunxi_usb_get_ep_in_type(void)
Get the IN endpoint type.
Definition usb.c:883
#define SUNXI_USB_DEVICE_MASS
Definition usb.h:159
void sunxi_usb_dump(uint32_t usbc_base, uint32_t ep_index)
Dump the USB controller registers for a specific endpoint.
Definition usb.c:891
uint16_t length
Definition usb.h:4
int sunxi_usb_get_ep_out_type(void)
Get the OUT endpoint type.
Definition usb.c:887
struct sunxi_usb_setup_req_s sunxi_usb_setup_req_t
int sunxi_usb_extern_loop()
Run the USB device state machine loop once.
Definition usb.c:813
void sunxi_usb_send_setup(uint32_t length, void *buffer)
Send a setup packet.
Definition usb.c:855
usb_device_speed
Definition usb.h:34
@ USB_SPEED_LOW
Definition usb.h:35
@ USB_SPEED_FULL
Definition usb.h:36
@ USB_SPEED_HIGH
Definition usb.h:37
@ USB_SPEED_RESERVED
Definition usb.h:38
#define sunxi_usb_module_ext(name)
Definition usb.h:166
void sunxi_usb_irq()
Handle the USB interrupt.
Definition usb.c:699
void sunxi_usb_attach()
Attach the USB device to the USB controller.
Definition usb.c:807
struct sunxi_udc sunxi_udc_t
int sunxi_usb_get_ep_max(void)
Get the maximum number of endpoints.
Definition usb.c:879
void sunxi_usb_attach_module(uint32_t device_type)
Attach a module to the USB controller.
Definition usb.c:539
void sunxi_usb_bulk_ep_reset()
Reset the bulk endpoints of the USB controller.
Definition usb.c:817
struct sunxi_ubuf sunxi_ubuf_t
int sunxi_usb_init()
Initialize the USB controller.
Definition usb.c:553
struct usb_endpoint_descriptor __attribute__((packed))
Definition bimage.c:53
int sunxi_usb_send_data(void *buffer, uint32_t buffer_size)
Send data over USB.
Definition usb.c:874
int sunxi_usb_set_address(uint32_t address)
Set USB device address.
Definition usb.c:868
#define SUNXI_USB_DEVICE_DETECT
Definition usb.h:158
void sunxi_usb_ep_reset()
Reset all endpoints of the USB controller.
Definition usb.c:695
int sunxi_usb_start_recv_by_dma(void *mem_base, uint32_t length)
Start receiving data by DMA.
Definition usb.c:835