📄 sl811.h
字号:
/*-------------------------------------------------------------------------*/
/*
* 来自Windows CE.
*
*
*/
/* Register numbers
*/
#define SL_HCR_A 0x00 // rw
#define SL_HBA_A 0x01 // rw
#define SL_HBL_A 0x02 // rw
#define SL_HPID_A 0x03 // wo
# define SL_STATUS_A 0x03 // ro
#define SL_HDA_A 0x04 // wo
#define SL_TC_A 0x04 // ro
#define SL_CTRL1 0x05 // rw
#define SL_INTEN 0x06 // rw
#define SL_SAR 0x07 // rw
#define SL_HCR_B 0x08 // rw
#define SL_HBA_B 0x09 // rw
#define SL_HBL_B 0x0a // rw
#define SL_HPID_B 0x0b // wo
# define SL_STATUS_B 0x0b // ro
#define SL_HDA_B 0x0c // wo
#define SL_TC_B 0x0c // ro
#define SL_ISTATUS 0x0d // rw
#define SL_SOF_LOW 0x0e // wo
# define SL_REV 0x0e // ro
#define SL_SOF_HI 0x0f // rw
#define SL_CTRL2 0x0f // w
#define SL_MEM 0x10 // rw
/* Host Control Register (0x0,0x8)
*/
#define SL_HCR_Arm 0x01
#define SL_HCR_Enable 0x02
#define SL_HCR_Out 0x04
#define SL_HCR_NextIsB 0x08
#define SL_HCR_ISO 0x10
#define SL_HCR_SOF 0x20
#define SL_HCR_DToggle 0x40
#define SL_HCR_Preamble 0x80
/* Host Base Address (0x1,0x9)
* NB: Pointer to internal RAM
*/
/* Host Base Length Register (0x2,0xa)
*/
#define SL_HBL_MAX (256-16)
/* Host PID Register(wo) (0x3,0xb)
*/
#define SL_HPID_EPMASK 0x0f
#define SL_HPID_PMASK 0xf0
#define SL_MAKE_HPID(p,e) ((UCHAR)((((p)&0xf)<<4) | ((e)&0xf)))
#define SL_HPID_SETUP 0xd
#define SL_HPID_IN 0x9
#define SL_HPID_OUT 0x1
#define SL_HPID_SOF 0x5
#define SL_HPID_PREAMBLE 0xc
#define SL_HPID_NAK 0xa
#define SL_HPID_STALL 0xe
#define SL_HPID_DATA0 0x3
#define SL_HPID_DATA1 0xb
/* Status Register A/B (ro) (0x3,0xb)
*/
#define SL_STATUS_ACK 0x01
#define SL_STATUS_Error 0x02
#define SL_STATUS_Timeout 0x04
#define SL_STATUS_Sequence 0x08
#define SL_STATUS_Setup 0x10
#define SL_STATUS_Overflow 0x20
#define SL_STATUS_NAK 0x40
#define SL_STATUS_STALL 0x80
/* Host Device Address Register (0x4,0xc)
*/
#define SL_HDA_MASK 0x7f
/* Host Transfer Count Register (0x4,0xc)
*/
/* Control Register 1 (0x5)
*/
#define SL_CTRL1_SOF_en 0x01
#define SL_CTRL1_reserved 0x82
#define SL_CTRL1_EOF2 0x04
#define SL_CTRL1_Reset 0x08
#define SL_CTRL1_force_J 0x10
#define SL_CTRL1_force_K 0x18
#define SL_CTRL1_LowSpeed 0x20
#define SL_CTRL1_Suspend 0x40
/* Interrupt Enable Register (0x6)
*/
#define SL_INTEN_DONE_A 0x01
#define SL_INTEN_DONE_B 0x02
#define SL_INTEN_reserved 0x0c
#define SL_INTEN_SOF 0x10
#define SL_INTEN_Insert 0x20
#define SL_INTEN_Detect 0x40
#define SL_INTEN_donno 0x80
/* Slave Address Register (ro) (0x7)
*/
/* Interrupt Status (rw1c) (0xd)
* NB: Same as INTEN above, plus
*/
#define SL_INTEN_D_PLUS 0x80
/* SOF Counter LOW (wo) (0xe)
*/
#define SL_SOFL_1ms 0xe0 // at 12MHz
/* Hardware Revision Register (ro) (0xe)
*/
#define SL_REV_MASK 0xf0
# define SL_REV_11H 0x00
# define SL_REV_11HS1p2 0x10
# define SL_REV_11HS1p5 0x20
/* SOF High + Control 2 Register (0xf)
*/
#define SL_SOFH_SOFmask 0x3f
# define SL_SOFH_set(v) (((v)>>6)&SL_SOFH_SOFmask)
# define SL_SOFH_get(v) ((v)<<6)
# define SL_SOFH_1ms 0x2e
#define SL_SOFH_Polarity 0x40
#define SL_SOFH_Master 0x80
/*-------------------------------------------------------------------------*/
/*
* USB上层代码.
*
* 余康华
*/
// nGCS3
#define SL811_ADDR_PORT 0x06000000
#define SL811_DATA_PORT 0x06000001
// EXINT0
#define ISR_SL811 ISR_EINT0
#define BIT_SL811 BIT_EINT0
// USB请求标志
#define URB_FLAG_LOW_SPEED 0x80000000
#define URB_FLAG_ISOCHRONOUS 0x40000000
#define URB_FLAG_INTERRUPT 0x20000000
#define URB_FLAG_IN 0x10000000
#define URB_FLAG_OUT 0x00000000
#define URB_FLAG_PERIODIC 0x08000000
#define URB_FLAG_CONTROL 0x04000000
#define URB_FLAG_STATUS 0x000000FF
#define URB_FLAG_ERROR 0x00000001
#define URB_FLAG_COMPLETE 0x00000002
// 端点结构体
typedef struct {
UCHAR Payload; // 端点容量
UCHAR Endpoint; // 端点号
UCHAR Toggle; // 数据兵浜操作
} EP;
// USB主机控制器结构体
typedef struct _HC {
UINT AddrPort; // 主机控制器地址端口
UINT DataPort; // 主机控制器数据端口
struct _URB *CurURB; // 当前USB请求
struct _URB *PrevURB; // 前一个USB请求
EP ep0; // 端口0信息
UINT SofInts; // 软中断允许位
UINT InsRmvInts; // USB插入或拔出次数
UINT DoneInts; // USB操作完成次数
UINT SusCnt; // USB操作位完成次数
UINT sm; // Control semaphore
UCHAR enumed; // 已经枚举过
UCHAR connected; // USB已经插入
UCHAR devfound; // U盘已经找到
UCHAR lowSpeed; // 找到慢速设备
UCHAR reset; // 是否需要复位
UCHAR ok; // 未用
UCHAR reqLen; // USB请求长度
void *request; // USB请求
UCHAR datLen; // USB请求数据长度
void *data; // USB请求数据
UCHAR toggle[16]; // 数据兵浜操作
struct usb_device_descriptor dev; // 设备描述符
struct usb_config_descriptor conf[1]; // 配置描述符
struct usb_interface_descriptor intf[1];// 接口描述符
struct usb_endpoint_descriptor ep[6]; // 端点描述符
} HC;
// U盘结构体
typedef struct _MASS_STOR {
HC *hc; // 主控制器
UINT BlockNumber; // U盘块数
UINT BlockSize; // U盘块大小
UINT BlockSizeShift; // U盘块大小对数
// UINT DiskSize;
EP In; // 输入端点信息
EP Out; // 输出端点信息
UCHAR DeviceAddress; // 设备地址
UCHAR devClass; // 设备类型
UCHAR devSubClass; // 子设备类型
UCHAR devProtocol; // 设备协议
} MASS_STOR;
// USB请求结构体
typedef struct _URB {
struct _URB *Next; // 指向下一个请求
EP *Ep; // 端点指针
UINT Flags; // 标志
UCHAR *Data; // 数据指针
UINT ExpectedDataLength; // 剩下数据总长读
UINT ActualDataLength; // 数据总长读
UINT SetupLength; // 令牌数据长度,8 Bytes
void *SetupData; // 令牌数据
UINT FinalStatus; // 最后结果
UCHAR NextStep; // 请求脚本下一步
UCHAR DeviceAddress; // 设备地址
} URB;
// USB输入输出脚本
typedef struct _SCRIPT {
int (*Start)(HC *, URB *);
int (*End)(HC *, URB *);
} SCRIPT;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -