📄 ch375inc.asm
字号:
; Define for CH372 & CH375
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.09
; V2.0 for CH372A/CH375A
; *********************************************************************************************************************
; 硬件特性
CH375_MAX_DATA_LEN EQU 40H ;最大数据包的长度, 内部缓冲区的长度
; *********************************************************************************************************************
; 命令代码
CMD_RESET_ALL EQU 05H ;执行硬件复位
CMD_CHECK_EXIST EQU 06H ;测试工作状态
; 输入: 任意数据
; 输出: 输入数据的按位取反
CMD_SET_USB_ID EQU 12H ;设备方式: 设置USB厂商VID和产品PID
; 输入: 厂商ID低字节, 厂商ID高字节, 产品ID低字节, 产品ID高字节
CMD_SET_USB_ADDR EQU 13H ;设置USB地址
; 输入: 地址值
CMD_SET_USB_MODE EQU 15H ;设置USB工作模式
; 输入: 模式代码
; 00H=未启用的设备方式, 01H=已启用的设备方式并且使用外部固件模式, 02H=已启用的设备方式并且使用内置固件模式, 03H=已启用的设备方式并且使用中断端点和内置固件模式
; 04H=未启用的主机方式, 05H=已启用的主机方式, 06H=已启用的主机方式并且自动产生SOF包, 07H=已启用的主机方式并且复位USB总线
; 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 )
CMD_SET_ENDP2 EQU 18H ;设备方式: 设置USB端点0的接收器
; 输入: 工作方式
; 位7为1则位6为同步触发位, 否则同步触发位不变
; 位3~位0为事务响应方式: 0000-就绪ACK, 1110-正忙NAK, 1111-错误STALL
CMD_SET_ENDP3 EQU 19H ;设备方式: 设置USB端点0的发送器
; 输入: 工作方式
; 位7为1则位6为同步触发位, 否则同步触发位不变
; 位3~位0为事务响应方式: 0000~1000-就绪ACK, 1110-正忙NAK, 1111-错误STALL
CMD_SET_ENDP4 EQU 1AH ;设备方式: 设置USB端点1的接收器
; 输入: 工作方式
; 位7为1则位6为同步触发位, 否则同步触发位不变
; 位3~位0为事务响应方式: 0000-就绪ACK, 1110-正忙NAK, 1111-错误STALL
CMD_SET_ENDP5 EQU 1BH ;设备方式: 设置USB端点1的发送器
; 输入: 工作方式
; 位7为1则位6为同步触发位, 否则同步触发位不变
; 位3~位0为事务响应方式: 0000~1000-就绪ACK, 1110-正忙NAK, 1111-错误STALL
CMD_SET_ENDP6 EQU 1CH ;设置USB端点2/主机端点的接收器
; 输入: 工作方式
; 位7为1则位6为同步触发位, 否则同步触发位不变
; 位3~位0为事务响应方式: 0000-就绪ACK, 1101-就绪但不返回ACK, 1110-正忙NAK, 1111-错误STALL
CMD_SET_ENDP7 EQU 1DH ;设置USB端点2/主机端点的发送器
; 输入: 工作方式
; 位7为1则位6为同步触发位, 否则同步触发位不变
; 位3~位0为事务响应方式: 0000-就绪ACK, 1101-就绪但无须应答, 1110-正忙NAK, 1111-错误STALL
CMD_GET_TOGGLE EQU 0AH ;获取OUT事务的同步状态
; 输入: 数据1AH
; 输出: 同步状态
; 位4为1则OUT事务同步, 否则OUT事务不同步
CMD_GET_STATUS EQU 22H ;获取中断状态并取消中断请求
; 输出: 中断状态
CMD_UNLOCK_USB EQU 23H ;设备方式: 释放当前USB缓冲区
CMD_RD_USB_DATA EQU 28H ;从当前USB中断的端点缓冲区读取数据块, 并释放缓冲区
; 输出: 长度, 数据流
CMD_WR_USB_DATA3 EQU 29H ;设备方式: 向USB端点0的发送缓冲区写入数据块
; 输入: 长度, 数据流
CMD_WR_USB_DATA5 EQU 2AH ;设备方式: 向USB端点1的发送缓冲区写入数据块
; 输入: 长度, 数据流
CMD_WR_USB_DATA7 EQU 2BH ;向USB端点2的发送缓冲区写入数据块
; 输入: 长度, 数据流
; **************************************************************************
; 以下命令用于USB主机方式, 只有CH375支持
CMD_SET_BAUDRATE EQU 02H ;串口方式: 设置串口通讯波特率
; 输入: 波特率分频系数, 波特率分频常数
; 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 )
CMD_ABORT_NAK EQU 17H ;主机方式: 放弃当前NAK的重试
;
CMD_SET_RETRY EQU 0BH ;主机方式: 设置USB事务操作的重试次数
; 输入: 数据25H, 重试次数
; 位7为1则收到NAK时无限重试, 位3~位0为超时后的重试次数
CMD_ISSUE_TOKEN EQU 4FH ;主机方式: 发出令牌, 执行事务
; 输入: 事务属性
; 低4位是令牌, 高4位是端点号
; 输出中断
CMD_CLR_STALL EQU 41H ;主机方式: 控制传输-清除端点错误
; 输入: 端点号
; 输出中断
CMD_SET_ADDRESS EQU 45H ;主机方式: 控制传输-设置USB地址
; 输入: 地址值
; 输出中断
CMD_GET_DESCR EQU 46H ;主机方式: 控制传输-获取描述符
; 输入: 描述符类型
; 输出中断
CMD_SET_CONFIG EQU 49H ;主机方式: 控制传输-设置USB配置
; 输入: 配置值
; 输出中断
CMD_DISK_INIT EQU 51H ;主机方式: 初始化USB存储器
; 输出中断
CMD_DISK_RESET EQU 52H ;主机方式: 复位USB存储器
; 输出中断
CMD_DISK_SIZE EQU 53H ;主机方式: 获取USB存储器的容量
; 输出中断
CMD_DISK_READ EQU 54H ;主机方式: 从USB存储器读数据块(以扇区512字节为单位)
; 输入: LBA扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH)
; 输出中断
CMD_DISK_RD_GO EQU 55H ;主机方式: 继续执行USB存储器的读操作
; 输出中断
CMD_DISK_WRITE EQU 56H ;主机方式: 向USB存储器写数据块(以扇区512字节为单位)
; 输入: LBA扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH)
; 输出中断
CMD_DISK_WR_GO EQU 57H ;主机方式: 继续执行USB存储器的写操作
; 输出中断
; **************************************************************************
; 以下新增的V2.0命令码, 仅CH372A/CH375A支持
CMD_GET_IC_VER EQU 01H ;获取芯片及固件版本
; 输出: 版本号( 位7为1, 位6为0, 位5~位0为版本号 )
; CH375返回无效值为5FH, CH375A返回版本号的值为0A2H
CMD_ENTER_SLEEP EQU 03H ;进入睡眠状态
CMD_RD_USB_DATA0 EQU 27H ;从当前USB中断的端点缓冲区读取数据块
; 输出: 长度, 数据流
CMD_DELAY_100US EQU 0FH ;并口方式: 延时100uS
; 输出: 延时期间输出0, 延时结束输出非0
CMD_CHK_SUSPEND EQU 0BH ;设备方式: 设置检查USB总线挂起状态的方式
; 输入: 数据10H, 检查方式
; 00H=不检查USB挂起, 04H=以50mS为间隔检查USB挂起, 05H=以10mS为间隔检查USB挂起
CMD_SET_SYS_FREQ EQU 04H ;设置系统工作频率
; 输入: 频率
; 00H=12MHz, 01H=1.5MHz
; **************************************************************************
; 以下改进的V2.0命令码, 用于USB主机方式, 仅CH375A支持
;CMD_SET_RETRY EQU 0BH ;主机方式: 设置USB事务操作的重试次数
; 输入: 数据25H, 重试次数
; 位7为0则收到NAK时不重试, 位7为1位6为0则收到NAK时无限重试, 位7为1位6为1则收到NAK时重试200mS, 位5~位0为超时后的重试次数
; **************************************************************************
; 以下新增的V2.0命令码, 用于USB主机方式, 仅CH375A支持
CMD_TEST_CONNECT EQU 16H ;主机方式: 检查USB设备连接状态
; 输出: 状态( USB_INT_CONNECT或USB_INT_DISCONNECT, 其它值说明操作未完成 )
CMD_AUTO_SETUP EQU 4DH ;主机方式: 自动配置USB设备
; 输出中断
CMD_ISSUE_TKN_X EQU 4EH ;主机方式: 发出同步令牌, 执行事务
; 输入: 同步标志, 事务属性
; 同步标志的位7为主机端点IN的同步触发位, 位6为主机端点OUT的同步触发位, 位5~位0必须为0
; 事务属性的低4位是令牌, 高4位是端点号
; 输出中断
CMD_SET_DISK_LUN EQU 0BH ;主机方式: 设置USB存储器的当前逻辑单元号
; 输入: 数据34H, 新的当前逻辑单元号(00H-0FH)
CMD_DISK_BOC_CMD EQU 50H ;主机方式: 对USB存储器执行BulkOnly传输协议的命令
; 输出中断
CMD_DISK_INQUIRY EQU 58H ;主机方式: 查询USB存储器特性
; 输出中断
CMD_DISK_READY EQU 59H ;主机方式: 检查USB存储器就绪
; 输出中断
CMD_DISK_R_SENSE EQU 5AH ;主机方式: 检查USB存储器错误
; 输出中断
CMD_DISK_MAX_LUN EQU 5DH ;主机方式: 获取USB存储器最大逻辑单元号
; 输出中断
; *********************************************************************************************************************
; 操作状态
CMD_RET_SUCCESS EQU 51H ;命令操作成功
CMD_RET_ABORT EQU 5FH ;命令操作失败
; *********************************************************************************************************************
; USB中断状态
; 以下状态代码为特殊事件中断, 仅CH372A/CH375A支持, 如果通过CMD_CHK_SUSPEND启用USB总线挂起检查, 那么必须处理USB总线挂起和睡眠唤醒的中断状态
USB_INT_USB_SUSPEND EQU 05H ;USB总线挂起事件
USB_INT_WAKE_UP EQU 06H ;从睡眠中被唤醒事件
; 以下状态代码0XH用于USB设备方式
; 内置固件模式下只需要处理: USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN, 对于CH372A/CH375A还需要处理: USB_INT_EP1_OUT
; 位7-位4为0000
; 位3-位2指示当前事务, 00=OUT, 10=IN, 11=SETUP
; 位1-位0指示当前端点, 00=端点0, 01=端点1, 10=端点2, 11=USB总线复位
USB_INT_EP0_SETUP EQU 0CH ;USB端点0的SETUP
USB_INT_EP0_OUT EQU 00H ;USB端点0的OUT
USB_INT_EP0_IN EQU 08H ;USB端点0的IN
USB_INT_EP1_OUT EQU 01H ;USB端点1的OUT
USB_INT_EP1_IN EQU 09H ;USB端点1的IN
USB_INT_EP2_OUT EQU 02H ;USB端点2的OUT
USB_INT_EP2_IN EQU 0AH ;USB端点2的IN
;USB_INT_BUS_RESET EQU 0000XX11B ;USB总线复位
USB_INT_BUS_RESET1 EQU 03H ;USB总线复位
USB_INT_BUS_RESET2 EQU 07H ;USB总线复位
USB_INT_BUS_RESET3 EQU 0BH ;USB总线复位
USB_INT_BUS_RESET4 EQU 0FH ;USB总线复位
; 以下状态代码2XH-3XH用于USB主机方式的通讯失败代码, 仅CH375/CH375A支持
; 位7-位6为00
; 位5为1
; 位4指示当前接收的数据包是否同步
; 位3-位0指示导致通讯失败时USB设备的应答: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=超时
;USB_INT_RET_ACK EQU 001X0010B ;错误:对于IN事务返回ACK
;USB_INT_RET_NAK EQU 001X1010B ;错误:返回NAK
;USB_INT_RET_STALL EQU 001X1110B ;错误:返回STALL
;USB_INT_RET_DATA0 EQU 001X0011B ;错误:对于OUT/SETUP事务返回DATA0
;USB_INT_RET_DATA1 EQU 001X1011B ;错误:对于OUT/SETUP事务返回DATA1
;USB_INT_RET_TOUT EQU 001XXX00B ;错误:返回超时
;USB_INT_RET_TOGX EQU 0010X011B ;错误:对于IN事务返回数据不同步
;USB_INT_RET_PID EQU 001XXXXXB ;错误:未定义
; 以下状态代码1XH用于USB主机方式的操作状态代码, 仅CH375/CH375A支持
USB_INT_SUCCESS EQU 14H ;USB事务或者传输操作成功
USB_INT_CONNECT EQU 15H ;检测到USB设备连接事件
USB_INT_DISCONNECT EQU 16H ;检测到USB设备断开事件
USB_INT_BUF_OVER EQU 17H ;USB控制传输的数据太多, 缓冲区溢出
USB_INT_DISK_READ EQU 1DH ;USB存储器读数据块, 请求数据读出
USB_INT_DISK_WRITE EQU 1EH ;USB存储器写数据块, 请求数据写入
USB_INT_DISK_ERR EQU 1FH ;USB存储器操作失败
; *********************************************************************************************************************
; 常用USB定义
; USB的包标识PID, 主机方式可能用到
DEF_USB_PID_NULL EQU 00H ;保留PID, 未定义
DEF_USB_PID_SOF EQU 05H
DEF_USB_PID_SETUP EQU 0DH
DEF_USB_PID_IN EQU 09H
DEF_USB_PID_OUT EQU 01H
DEF_USB_PID_ACK EQU 02H
DEF_USB_PID_NAK EQU 0AH
DEF_USB_PID_STALL EQU 0EH
DEF_USB_PID_DATA0 EQU 03H
DEF_USB_PID_DATA1 EQU 0BH
DEF_USB_PID_PRE EQU 0CH
; USB请求类型, 外置固件模式可能用到
DEF_USB_REQ_READ EQU 80H ;控制读操作
DEF_USB_REQ_WRITE EQU 00H ;控制写操作
DEF_USB_REQ_TYPE EQU 60H ;控制请求类型
DEF_USB_REQ_STAND EQU 00H ;标准请求
DEF_USB_REQ_CLASS EQU 20H ;设备类请求
DEF_USB_REQ_VENDOR EQU 40H ;厂商请求
DEF_USB_REQ_RESERVE EQU 60H ;保留请求
; USB标准设备请求, RequestType的位6位5=00(Standard), 主机方式可能用到
DEF_USB_CLR_FEATURE EQU 01H
DEF_USB_SET_FEATURE EQU 03H
DEF_USB_GET_STATUS EQU 00H
DEF_USB_SET_ADDRESS EQU 05H
DEF_USB_GET_DESCR EQU 06H
DEF_USB_SET_DESCR EQU 07H
DEF_USB_GET_CONFIG EQU 08H
DEF_USB_SET_CONFIG EQU 09H
DEF_USB_GET_INTERF EQU 0AH
DEF_USB_SET_INTERF EQU 0BH
DEF_USB_SYNC_FRAME EQU 0CH
; *********************************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -