📄 chapter9.lst
字号:
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CHAPTER9
OBJECT MODULE PLACED IN Chapter9.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Chapter9.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "ds89c4xx.h"
2 #include "mytype.h"
3 #include "D12CI.h"
4 #include "D12HAL.h"
5 #include "Chapter9.h"
6 #include "Descriptor.h"
7 #include "uart0.h"
8
9 #ifndef _swap_data_
10 #define _swap_data_
11
12 #define SWAP16(x) ((((uint16)(x))<<8)|(((uint16)(x))>>8)) //高低字节交换
13 #define LSB(x) ((uint8)(x)) //取一个整数的低字节
14 #define MSB(x) ((uint8)(((uint16)(x))>>8)) //取一个整数的高字节
15
16 #endif
17
18 //定义传输控制结构变量
19 CONTROL_XFER idata ControlData;
20
21 //定义USB事件标志变量
22 EPPFLAGS idata bEPPflags;
23
24 uint8 idata idle,protocol;
25
26 //*************************************************************************
27 //USB标准设备请求入口地址指针表
28 //*************************************************************************
29 void (*StandardDeviceRequest[])(void) =
30 {
31 get_status,
32 clear_feature,
33 reserved,
34 set_feature,
35 reserved,
36 set_address,
37 get_descriptor,
38 reserved,
39 get_configuration,
40 set_configuration,
41 get_interface,
42 set_interface,
43 reserved,
44 reserved,
45 reserved,
46 reserved
47 };
48
49 void (*ClassDeviceRequest[])(void) =
50 {
51 reserved,
52 get_report,
53 get_idle,
54 get_protocol,
55 reserved,
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 2
56 reserved,
57 reserved,
58 reserved,
59 reserved,
60 set_report,
61 set_idle,
62 set_protocol
63 };
64
65 //*************************************************************************
66 // USB 协议层函数
67 //*************************************************************************
68
69 /*************************************
70 ** 函数名称: void stall_ep0(void)
71 ** 功能描述: 使控制端点处于停止状态
72 **************************************/
73 void stall_ep0(void)
74 {
75 1 D12_SetEndpointStatus(0, 1);
76 1 D12_SetEndpointStatus(1, 1);
77 1 }
78
79
80 /*************************************
81 ** 函数名称: void reserved(void)
82 ** 功能描述: 保留子程序
83 **************************************/
84 void reserved(void)
85 {
86 1 stall_ep0(); //返回STALL
87 1 }
88
89
90 /**********************************************
91 ** 函数名称: void init_unconfig(void)
92 ** 功能描述: 进入地址状态,禁止0除外的所有端点
93 ***********************************************/
94 void init_unconfig(void)
95 {
96 1 D12_SetEndpointEnable(0); //禁止0除外的所有端点
97 1 }
98
99 /**********************************************
100 ** 函数名称: void init_config(void)
101 ** 功能描述: 配置处理,允许端点收发
102 ***********************************************/
103 void init_config(void)
104 {
105 1 D12_SetEndpointEnable(1); //使能普通/同步端点使能
106 1 }
107
108
109 /*********************************************************
110 ** 函数名称: void single_transmit(uint8 * buf, uint8 len)
111 ** 功能描述: 通过端点索引 1 发送数据(DATA 类型)
112 ** 输 入: uint8 * buf: 发送数据指针
113 uint8 len: 发送数据长度
114 ** 输 出: 无
115 **********************************************************/
116 void single_transmit(uint8 *buf, uint8 len)
117 {
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 3
118 1 if( len <= EP0_PACKET_SIZE) { //长度小于EP0最大信息包大小才允许发送
119 2 D12_WriteEndpoint(1, len, buf);
120 2 }
121 1 }
122
123 /*************************************************************
124 ** 函数名称: void code_transmit(uint8 * pRomData, uint16 len)
125 ** 功能描述: 通过端点索引 1 发送数据(CODE类型)
126 ** 输 入: uint8 *pRomData: 发送数据指针
127 uint16 len: 发送数据长度
128 ** 输 出: 无
129 **************************************************************/
130 void code_transmit(uint8 * pRomData, uint16 idata len)
131 {
132 1 if(!bEPPflags.bits.transmit_not_end)
133 1 {
134 2 ControlData.wCount = 0; //传输字节数计数器清0
135 2 if(ControlData.wLength > len)
136 2 ControlData.wLength = len; //传输数据总字节数不得超过len
137 2
138 2 ControlData.pData = pRomData; //传输数据指针指向pRomData
139 2 }
140 1 if( ControlData.wLength >= EP0_PACKET_SIZE) //传输数据总字节数大于端点0最大信息包大小
141 1 {
142 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, (ControlData.pData + ControlData.wCount)); //发送端点0最大信息包大
-小个字节
143 2 ControlData.wCount += EP0_PACKET_SIZE; //统计已发送字节数
144 2 bEPPflags.bits.control_state = USB_TRANSMIT; //标志数据发送状态
145 2 bEPPflags.bits.transmit_not_end = 1; //数据未发送完成
146 2 //ControlData.wLength -= EP0_PACKET_SIZE;
147 2 //PutUint320(ControlData.wLength,10);
148 2 }
149 1 else if(ControlData.wLength > 0)
150 1 {
151 2 //PutUint320(ControlData.wLength,10);
152 2 D12_WriteEndpoint(1, ControlData.wLength, (ControlData.pData + ControlData.wCount)); //写入传输数据总字
-节数
153 2 ControlData.wCount += ControlData.wLength; //统计已发送字节数
154 2 bEPPflags.bits.control_state = USB_IDLE; //标志空闲状态
155 2 //bEPPflags.bits.transmit_not_end = 0; //传输结束
156 2 ControlData.wLength = 0;
157 2 }
158 1 else
159 1 {
160 2 //PutUint320(ControlData.wLength,10);
161 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发0个字节
162 2 bEPPflags.bits.control_state = USB_IDLE;
163 2 //bEPPflags.bits.transmit_not_end = 0; //传输结束
164 2 }
165 1 }
166
167
168 //*************************************************************************
169 // USB 标准设备请求服务程序
170 //*************************************************************************
171
172 /********************************************************************
173 ** 函数名称: void get_status(void)
174 ** 功能描述: 主机要求获取状态,设备返回16位的状态描述给主机
175 *********************************************************************/
176 void get_status(void)
177 {
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 4
178 1 uint8 idata endp, txdat[2], c;
179 1 uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
180 1 //取得设备请求类型
181 1 if (bRecipient == USB_RECIPIENT_DEVICE) //对设备请求
182 1 {
183 2 if(bEPPflags.bits.remote_wakeup == 1)
184 2 txdat[0] = 2; //支持远程唤醒、总线供电
185 2 else
186 2 txdat[0] = 0; //不支持远程唤醒、总线供电
187 2 txdat[1]=0; //高8位为0
188 2 single_transmit(txdat, 2); //发送16位的状态到主机
189 2 }
190 1 else if (bRecipient == USB_RECIPIENT_INTERFACE) //对接口请求
191 1 {
192 2 txdat[0]=0;
193 2 txdat[1]=0;
194 2 single_transmit(txdat, 2); //发送16位的状态到主机
195 2 }
196 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT) //对端点请求
197 1 {
198 2 endp = (uint8)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
199 2 if (ControlData.DeviceRequest.wIndex & (uint8)USB_ENDPOINT_DIRECTION_MASK)
200 2 c = D12_SelectEndpoint(endp*2 + 1); //读取输入端点状态
201 2 else
202 2 c = D12_SelectEndpoint(endp*2); //读取输出端点状态
203 2 if(c & D12_STALL)
204 2 txdat[0] = 1; //端点禁止
205 2 else
206 2 txdat[0] = 0; //端点有效
207 2 txdat[1] = 0;
208 2 single_transmit(txdat, 2); //发送16位的状态到主机
209 2 } else
210 1 stall_ep0(); //非标准请求,发STALL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -