📄 usbdrv.h
字号:
#ifndef __USBDRV_H__#define __USBDRV_H__#include <instructions.h>#include <bsp.h>#define UDC_BUF_SIZE 8#ifndef clr_imask_bit#define clr_imask_bit(int_type) do{i_s32((1<<int_type),IMCR,0);}while(0)#endif#define udc_set_reg(addr, val) (i_s32((val), (addr), 0))#define udc_get_reg(addr, val) (val = i_l32((addr), 0))#define set_dev_config(speed,rwcap,slfpwr) \({ \ int tmp = (slfpwr << 3 | rwcap << 2 | speed); \ i_s32 (tmp|(i_l32(UDC_DevConfig,0)), UDC_DevConfig, 0); \})#define set_udc_devcrs(speed,rwcap,slfpwr,devctrl,devintrmsk,epintrmsk) \({ \ set_dev_config(speed, rwcap, slfpwr); \ udc_set_reg (UDC_DevControl, devctrl); \ udc_set_reg (UDC_DevIntrMask, devintrmsk); \ udc_set_reg (UDC_EPIntrMask, epintrmsk); \})#define set_udc_epcrs() \({ \ int tmp = 0; \ /* ctrl */ \ udc_get_reg (UDC_EP0OutControl, tmp); \ tmp = (tmp & 0xffffffcf) | (UDC_CTRL_TYPE << 0x4); \ udc_set_reg (UDC_EP0OutControl, tmp); \ udc_get_reg (UDC_EP0InControl, tmp); \ udc_set_reg (UDC_EP0InControl, (tmp | UDC_FLUSH_FIFO)); \ udc_set_reg (UDC_EP0InControl, (tmp & (~UDC_FLUSH_FIFO))); \ \ /* bulk in */ \ udc_get_reg (UDC_EP1InControl, tmp); \ tmp = (tmp & 0xffffffcf) | (UDC_BULK_TYPE << 0x4); \ udc_set_reg (UDC_EP1InControl, tmp); \ udc_get_reg (UDC_EP1InControl, tmp); \ udc_set_reg (UDC_EP1InControl, (tmp | UDC_FLUSH_FIFO)); \ udc_set_reg (UDC_EP1InControl, (tmp & (~UDC_FLUSH_FIFO))); \ \ /* bulk out */ \ udc_get_reg (UDC_EP2OutControl, tmp); \ tmp = (tmp & 0xffffffcf) | (UDC_BULK_TYPE << 0x4); \ udc_set_reg (UDC_EP2OutControl, tmp); \ \})#define set_udc_infors() \({ \ udc_set_reg (UDC_EP0Info,0x80 | (8 << 19)); /* endpt 0, out, ctrl, cfg 1, 8 max*/ \ udc_set_reg (UDC_EP1Info,0xd1 | (64 << 19)); /* endpt 1, in, bulk, cfg 1, 64 max*/ \ udc_set_reg (UDC_EP2Info,0xc2 | (64 << 19)); /* endpt 2, out, bulk, cfg 1, 64 max*/ \})typedef struct usb_devreq { unsigned char type; unsigned char request; unsigned char value_lo; unsigned char value_hi; unsigned char index_lo; unsigned char index_hi; unsigned char length_lo; unsigned char length_hi;} usb_devreq __attribute__((packed));typedef struct usb_device_descriptor { unsigned char length; // USB_DEVICE_DESCRIPTOR_LENGTH == 18 unsigned char type; // USB_DEVREQ_DESCRIPTOR_TYPE unsigned char usb_spec_lo; unsigned char usb_spec_hi; unsigned char device_class; unsigned char device_subclass; unsigned char device_protocol; unsigned char max_packet_size; unsigned char vendor_lo; unsigned char vendor_hi; unsigned char product_lo; unsigned char product_hi; unsigned char device_lo; unsigned char device_hi; unsigned char manufacturer_str; unsigned char product_str; unsigned char serial_number_str; unsigned char number_configurations;} usb_device_descriptor __attribute__((packed)); typedef struct usb_configuration_descriptor { unsigned char length; unsigned char type; unsigned char total_length_lo; unsigned char total_length_hi; unsigned char number_interfaces; unsigned char configuration_id; unsigned char configuration_str; unsigned char attributes; unsigned char max_power;} usb_configuration_descriptor __attribute__((packed)); typedef struct usb_interface_descriptor { unsigned char length; unsigned char type; unsigned char interface_id; unsigned char alternate_setting; unsigned char number_endpoints; unsigned char interface_class; unsigned char interface_subclass; unsigned char interface_protocol; unsigned char interface_str;} usb_interface_descriptor __attribute__((packed)); typedef struct usb_endpoint_descriptor { unsigned char length; unsigned char type; unsigned char endpoint; unsigned char attributes; unsigned char max_packet_lo; unsigned char max_packet_hi; unsigned char interval;} usb_endpoint_descriptor __attribute__((packed));struct USB_INFO{unsigned int command; //request commandunsigned int type; //request typeunsigned int total_len; //total length to sendunsigned int cur_len; //now send length unsigned int count; //reserved} usb_info ; #define GET_DESCRIPTOR 0x6#define GET_CONFIGURATION 0x8#define SET_CONFIGURATION 0x9#define GET_INTERFACE 0x10#define SET_INTERFACE 0x11#define SYNCH_FRAME 0x12#define GET_STATUS 0x0#define GET_FEATURE 0x1#define SET_FEATURE 0x3#define SET_ADDRESS 0x5#define SET_DESCRIPTOR 0x7#define Device_Type 0x1#define Config_Type 0x2#define String_Type 0x3#define Interface_Type 0x4#define Endpoint_Type 0x5#define get_setup_command(addr) i_l8u(addr + 1, 0)#define get_dev_type(addr) i_l8u(addr + 3, 0)#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -