ATY_LIB V2_102_230218
ATY_LIB for general devices or ALGO
 
Loading...
Searching...
No Matches
usb_keyboard.c File Reference
#include "fw_hal.h"
#include <string.h>

Go to the source code of this file.

Macros

#define KeyIO   P0
 

Functions

void USB_Init (void)
 
void KeyScan (void)
 
void SendKeyStatus (void)
 
void main ()
 
 INTERRUPT (USB_Routine, EXTI_VectUSB)
 
uint8_t KeyCount (uint16_t dat)
 
 INTERRUPT (Timer0_Routine, EXTI_VectTimer0)
 

Variables

__BIT B_1ms
 
__BIT KeyChangeTemp
 
__BIT KeyChangeFlag
 
uint16_t cnt50ms
 
uint16_t KeyCode
 
uint16_t OldKeyCode
 
uint16_t NewKeyCode
 
uint16_t KeyHoldTime
 
__CODE uint8_t DEVICEDESC [18]
 
__CODE uint8_t CONFIGDESC [41]
 
__CODE uint8_t HIDREPORTDESC [63]
 
__CODE uint8_t LANGIDDESC [4]
 
__CODE uint8_t MANUFACTDESC [8]
 
__CODE uint8_t PRODUCTDESC [30]
 
__CODE uint8_t KeyMap [16]
 
__XDATA uint8_t HidFreature [64]
 
__XDATA uint8_t HidInput [64]
 
__XDATA uint8_t HidOutput [64]
 
USB_Request_t usb_request
 
USB_EP0_Stage_t usb_ep0_stage
 

Macro Definition Documentation

◆ KeyIO

#define KeyIO   P0

USB Keyboard Demo

P0: 8 bits for 4x4 Key matrix P6.0: NumLock P6.1: CapsLock

Definition at line 26 of file usb_keyboard.c.

Function Documentation

◆ INTERRUPT() [1/2]

INTERRUPT ( Timer0_Routine  ,
EXTI_VectTimer0   
)

Definition at line 442 of file usb_keyboard.c.

443{
444 B_1ms = 1;
445}
__BIT B_1ms
Definition: usb_keyboard.c:28

◆ INTERRUPT() [2/2]

INTERRUPT ( USB_Routine  ,
EXTI_VectUSB   
)

Definition at line 113 of file usb_keyboard.c.

114{
115 uint8_t intrusb;
116 uint8_t intrin;
117 uint8_t introut;
118 uint8_t csr;
119 uint8_t cnt;
120 uint16_t len = 0;
121 intrusb = USB_ReadReg(INTRUSB);
122 intrin = USB_ReadReg(INTRIN1);
123 introut = USB_ReadReg(INTROUT1);
124 if (intrusb & RSTIF)
125 {
131 }
132 if (intrin & EP0IF)
133 {
135 csr = USB_ReadReg(CSR0);
136 if (csr & STSTL)
137 {
138 USB_WriteReg(CSR0, csr & ~STSTL);
140 }
141 if (csr & SUEND)
142 {
143 USB_WriteReg(CSR0, csr | SSUEND);
144 }
145 switch (usb_ep0_stage.bStage)
146 {
148 if (csr & OPRDY)
149 {
155 {
157 switch (usb_request.bRequest)
158 {
161 break;
162
171 break;
172
175 switch (usb_request.wValue.bb.bh)
176 {
179 len = sizeof(DEVICEDESC);
180 break;
181
184 len = sizeof(CONFIGDESC);
185 break;
186
188 switch (usb_request.wValue.bb.bl)
189 {
190 case 0:
192 len = sizeof(LANGIDDESC);
193 break;
194
195 case 1:
197 len = sizeof(MANUFACTDESC);
198 break;
199
200 case 2:
202 len = sizeof(PRODUCTDESC);
203 break;
204
205 default:
207 break;
208 }
209 break;
210
213 len = sizeof(HIDREPORTDESC);
214 break;
215
216 default:
218 break;
219 }
220 if (len < usb_ep0_stage.wResidue)
221 {
223 }
224 break;
225
226 default:
228 break;
229 }
230 break;
231
233 switch (usb_request.bRequest)
234 {
238 break;
239
243 break;
244
246 break;
247
248 // case USB_HidReq_GetIdle:
249 // case USB_HidReq_GetProtocol:
250 // case USB_HidReq_SetProtocol:
251 default:
253 break;
254 }
255 break;
256
257 default:
259 break;
260 }
261
262 switch (usb_ep0_stage.bStage)
263 {
266 goto L_Ep0SendData;
267 break;
268
271 break;
272
276 break;
277
281 break;
282 }
283 }
284 break;
285
287 if (!(csr & IPRDY))
288 {
289 L_Ep0SendData:
292 usb_ep0_stage.wResidue -= cnt;
293 usb_ep0_stage.pData += cnt;
294 if (usb_ep0_stage.wResidue == 0)
295 {
298 }
299 else
300 {
302 }
303 }
304 break;
305
307 if (csr & OPRDY)
308 {
310 usb_ep0_stage.wResidue -= cnt;
311 usb_ep0_stage.pData += cnt;
312 if (usb_ep0_stage.wResidue == 0)
313 {
316 }
317 else
318 {
320 }
321 }
322 break;
323 }
324 }
325
326 if (intrin & EP1INIF)
327 {
329 csr = USB_ReadReg(INCSR1);
330 if (csr & INSTSTL)
331 {
333 }
334 if (csr & INUNDRUN)
335 {
337 }
338 }
339
340 if (introut & EP1OUTIF)
341 {
343 csr = USB_ReadReg(OUTCSR1);
344 if (csr & OUTSTSTL)
345 {
347 }
348 if (csr & OUTOPRDY)
349 {
352
353 P6 = ~HidOutput[0]; // update LED status
354 }
355 }
356}
unsigned short uint16_t
Definition: fw_types.h:19
unsigned char uint8_t
Definition: fw_types.h:18
#define SDSTL
Definition: fw_usb.h:70
@ USB_HidReq_SetIdle
Definition: fw_usb.h:148
@ USB_HidReq_SetReport
Definition: fw_usb.h:147
@ USB_HidReq_GetReport
Definition: fw_usb.h:144
#define OUTMAXP
Definition: fw_usb.h:91
#define CSR0
Definition: fw_usb.h:67
#define INCLRDT
Definition: fw_usb.h:77
#define EP1OUTIF
Definition: fw_usb.h:39
#define INTRUSB
Definition: fw_usb.h:40
#define OUTCSR1
Definition: fw_usb.h:92
#define EP0IF
Definition: fw_usb.h:33
#define INUNDRUN
Definition: fw_usb.h:81
#define INCSR1
Definition: fw_usb.h:76
#define INMODEOUT
Definition: fw_usb.h:88
#define USB_SelectEndPoint(__INDEX__)
Definition: fw_usb.h:230
void USB_WriteReg(uint8_t addr, uint8_t dat)
#define INSTSTL
Definition: fw_usb.h:78
#define INTROUT1
Definition: fw_usb.h:34
#define EP1INIF
Definition: fw_usb.h:32
uint8_t USB_ReadReg(uint8_t addr)
#define OUTOPRDY
Definition: fw_usb.h:100
#define SSUEND
Definition: fw_usb.h:68
void USB_WriteFIFO(uint8_t fifo, uint8_t *pdat, uint8_t cnt)
@ USB_RequestType_Standard
Definition: fw_usb.h:168
@ USB_RequestType_Class
Definition: fw_usb.h:169
#define INCSR2
Definition: fw_usb.h:84
uint8_t USB_ReadFIFO(uint8_t fifo, uint8_t *pdat)
#define FADDR
Definition: fw_usb.h:25
#define INTRIN1
Definition: fw_usb.h:27
@ USB_CtrlState_DataIn
Definition: fw_usb.h:122
@ USB_CtrlState_Stalled
Definition: fw_usb.h:124
@ USB_CtrlState_Idle
Definition: fw_usb.h:120
@ USB_CtrlState_DataOut
Definition: fw_usb.h:123
@ USB_CtrlState_SettingUp
Definition: fw_usb.h:121
#define FIFO0
Definition: fw_usb.h:109
#define OUTCLRDT
Definition: fw_usb.h:93
#define IPRDY
Definition: fw_usb.h:74
@ USB_DescriptorType_String
Definition: fw_usb.h:156
@ USB_DescriptorType_Report
Definition: fw_usb.h:160
@ USB_DescriptorType_Device
Definition: fw_usb.h:154
@ USB_DescriptorType_Configuration
Definition: fw_usb.h:155
#define RSTIF
Definition: fw_usb.h:42
#define FIFO1
Definition: fw_usb.h:110
@ USB_StdReq_GetDescriptor
Definition: fw_usb.h:133
@ USB_StdReq_SetConfiguration
Definition: fw_usb.h:136
@ USB_StdReq_SetAddress
Definition: fw_usb.h:132
#define INMAXP
Definition: fw_usb.h:66
#define DATEND
Definition: fw_usb.h:72
#define STSTL
Definition: fw_usb.h:73
#define REQUEST_TYPE_MASK
Definition: fw_usb.h:164
#define SOPRDY
Definition: fw_usb.h:69
#define SUEND
Definition: fw_usb.h:71
#define OUTSTSTL
Definition: fw_usb.h:94
#define INMODEIN
Definition: fw_usb.h:87
#define OPRDY
Definition: fw_usb.h:75
uint16_t wResidue
Definition: fw_usb.h:255
uint8_t bStage
Definition: fw_usb.h:254
uint8_t * pData
Definition: fw_usb.h:256
uint16_2uint8_t wLength
Definition: fw_usb.h:249
uint8_t bmRequestType
Definition: fw_usb.h:245
uint8_t bRequest
Definition: fw_usb.h:246
uint16_2uint8_t wValue
Definition: fw_usb.h:247
struct uint16_2uint8_t::_bb bb
__XDATA uint8_t HidFreature[64]
Definition: usb_keyboard.c:44
__XDATA uint8_t HidOutput[64]
Definition: usb_keyboard.c:46
__CODE uint8_t MANUFACTDESC[8]
Definition: usb_keyboard.c:41
__CODE uint8_t HIDREPORTDESC[63]
Definition: usb_keyboard.c:39
USB_Request_t usb_request
Definition: usb_keyboard.c:47
__CODE uint8_t DEVICEDESC[18]
Definition: usb_keyboard.c:37
USB_EP0_Stage_t usb_ep0_stage
Definition: usb_keyboard.c:48
__CODE uint8_t CONFIGDESC[41]
Definition: usb_keyboard.c:38
__CODE uint8_t PRODUCTDESC[30]
Definition: usb_keyboard.c:42
__CODE uint8_t LANGIDDESC[4]
Definition: usb_keyboard.c:40

◆ KeyCount()

uint8_t KeyCount ( uint16_t  dat)

Definition at line 358 of file usb_keyboard.c.

359{
360 uint8_t i;
361
362 i = 0;
363 while (dat)
364 {
365 if (dat & 0x8000) i++;
366 dat <<= 1;
367 }
368 return i;
369}
__CODE int8_t dat[20]
uint8_t __XDATA i

◆ KeyScan()

void KeyScan ( void  )

Definition at line 463 of file usb_keyboard.c.

464{
466
467 KeyIO = 0x0F;
468 SYS_DelayUs(1);
469 if ((KeyIO & 0x0F) == 0x0F) // no key pressed
470 {
471 NewKeyCode = 0;
472 }
473 else // start scan
474 {
475 // scan first line
476 KeyIO = (uint8_t)~0x10;
477 SYS_DelayUs(1);
478 // save 4 keys status
479 temp = KeyIO & 0x0F;
480
481 // second line
482 KeyIO = (uint8_t)~0x20;
483 SYS_DelayUs(1);
484 temp |= KeyIO << 4;
485
486 // save current key status
487 NewKeyCode = (~temp) & 0xFF;
488
489 // third line
490 KeyIO = (uint8_t)~0x40;
491 SYS_DelayUs(1);
492 temp = KeyIO & 0x0F;
493
494 // 4th line
495 KeyIO = (uint8_t)~0x80;
496 SYS_DelayUs(1);
497 temp |= KeyIO << 4;
498
499 // save all 16 keys' status in 2 bytes, 1 indicates key pressed
500 NewKeyCode |= (((uint16_t)~temp) << 8);
501 }
502
503 if (NewKeyCode != OldKeyCode)
504 {
505 KeyHoldTime = 0;
507 KeyChangeTemp = 1;
508 }
509 else
510 {
511 KeyHoldTime++;
512 if (KeyHoldTime >= 1)
513 {
514 KeyHoldTime = 1;
516 if (KeyChangeTemp)
517 {
518 KeyChangeTemp = 0;
519 KeyChangeFlag = 1; // Set send flag
520 }
521 }
522 }
523}
temp
Definition: DS18B20_ATY.c:215
void SYS_DelayUs(uint16_t t)
Definition: fw_sys.c:75
uint16_t NewKeyCode
Definition: usb_keyboard.c:34
__BIT KeyChangeFlag
Definition: usb_keyboard.c:30
#define KeyIO
Definition: usb_keyboard.c:26
uint16_t KeyHoldTime
Definition: usb_keyboard.c:35
uint16_t OldKeyCode
Definition: usb_keyboard.c:33
__BIT KeyChangeTemp
Definition: usb_keyboard.c:29
uint16_t KeyCode
Definition: usb_keyboard.c:32

◆ main()

void main ( void  )

Definition at line 54 of file usb_keyboard.c.

55{
56 uint8_t i;
57
61
62 USB_Init();
63
69
70 for (i = 0; i < 8; i++)
71 {
72 HidInput[i] = 0;
73 }
74
75 while (1)
76 {
77 if (B_1ms) // every 1 ms
78 {
79 B_1ms = 0;
80 if (++cnt50ms >= 50) // scan every 50 ms
81 {
82 cnt50ms = 0;
83 KeyScan();
84 }
85 if (KeyChangeFlag) // if key status changed
86 {
87 KeyChangeFlag = 0;
89 }
90 }
91 }
92}
#define EXTI_Timer0_SetIntPriority(__PRIORITY__)
Definition: fw_exti.h:214
@ EXTI_IntPriority_High
Definition: fw_exti.h:25
#define EXTI_Timer0_SetIntState(__STATE__)
Definition: fw_exti.h:116
#define EXTI_Global_SetIntState(__STATE__)
Definition: fw_exti.h:115
#define GPIO_P3_SetMode(__PINS__, __MODE__)
Definition: fw_gpio.h:89
@ GPIO_Pin_0
Definition: fw_gpio.h:45
@ GPIO_Pin_All
Definition: fw_gpio.h:53
@ GPIO_Pin_1
Definition: fw_gpio.h:46
#define GPIO_P1_SetMode(__PINS__, __MODE__)
Definition: fw_gpio.h:79
#define GPIO_P6_SetMode(__PINS__, __MODE__)
Definition: fw_gpio.h:105
@ GPIO_Mode_Input_HIP
Definition: fw_gpio.h:25
@ GPIO_Mode_Output_PP
Definition: fw_gpio.h:24
@ GPIO_Mode_InOut_QBD
Definition: fw_gpio.h:23
@ TIM_TimerMode_16BitAuto
Definition: fw_tim.h:24
void TIM_Timer0_Config(HAL_State_t freq1t, TIM_TimerMode_t mode, uint16_t frequency)
Definition: fw_tim.c:38
#define TIM_Timer0_SetRunState(__STATE__)
Definition: fw_tim.h:35
@ HAL_State_ON
Definition: fw_types.h:71
__XDATA uint8_t HidInput[64]
Definition: usb_keyboard.c:45
void USB_Init(void)
Definition: usb_keyboard.c:94
uint16_t cnt50ms
Definition: usb_keyboard.c:31
void SendKeyStatus(void)
Definition: usb_keyboard.c:372
void KeyScan(void)
Definition: usb_keyboard.c:463

◆ SendKeyStatus()

void SendKeyStatus ( void  )

Definition at line 372 of file usb_keyboard.c.

373{
374 uint8_t i,n;
375
376 if(KeyCode) // if key pressed
377 {
378 // allow 3 keys pressed simultaneously
379 if(KeyCount(KeyCode) > 3)
380 {
381 return; // too many keys
382 }
383 else
384 {
385 n = 2;
386 for (i = 0; i < 16; i++)
387 {
388 if (i == 1)
389 {
390 if (KeyCode & (1 << i)) // left Ctrl
391 {
392 HidInput[0] |= 1;
393 }
394 else
395 {
396 HidInput[0] &= ~1;
397 }
398 }
399 else if (i == 2)
400 {
401 if (KeyCode & (1 << i)) // left alt
402 {
403 HidInput[0] |= 1 << 2;
404 }
405 else
406 {
407 HidInput[0] &= ~(1 << 2);
408 }
409 }
410 else
411 {
412 if (KeyCode & (1 << i))
413 {
414 HidInput[n++] = KeyMap[i];
415 }
416 }
417 }
418
419 for(; n<8; n++)
420 {
421 HidInput[n]=0; // fill 0 to the rest
422 }
423 }
424 }
425 else // if no key pressed, return 0
426 {
427 for (i = 0; i < 8; i++)
428 {
429 HidInput[i] = 0;
430 }
431 }
432
433 // return 8 bytes data
435 for (i = 0; i < 8; i++)
436 {
438 }
440}
#define INIPRDY
Definition: fw_usb.h:83
uint8_t KeyCount(uint16_t dat)
Definition: usb_keyboard.c:358
__CODE uint8_t KeyMap[16]
Definition: usb_keyboard.c:43

◆ USB_Init()

void USB_Init ( void  )

Definition at line 94 of file usb_keyboard.c.

95{
101
102 USB_WriteReg(FADDR, 0x00);
103 USB_WriteReg(POWER, 0x08);
104 USB_WriteReg(INTRIN1E, 0x3f);
105 USB_WriteReg(INTROUT1E, 0x3f);
106 USB_WriteReg(INTRUSBE, 0x00);
107 USB_WriteReg(POWER, 0x01);
109
111}
#define EXTI_USB_SetIntPriority(__PRIORITY__)
Definition: fw_exti.h:228
@ EXTI_IntPriority_Highest
Definition: fw_exti.h:26
#define EXTI_USB_SetIntState(__STATE__)
Definition: fw_exti.h:129
#define SYS_EnableOscillator48M()
Definition: fw_sys.h:153
#define INTROUT1E
Definition: fw_usb.h:52
#define POWER
Definition: fw_usb.h:26
#define INTRIN1E
Definition: fw_usb.h:45
#define INTRUSBE
Definition: fw_usb.h:58
@ USB_ClockSource_6M
Definition: fw_usb.h:175
#define USB_SetClockSource(__SOURCE__)
Definition: fw_usb.h:190
#define USB_SetEnabled(__STATE__)
Definition: fw_usb.h:196
#define USB_SetDpDmPullUp(__STATE__)
Definition: fw_usb.h:203

Variable Documentation

◆ B_1ms

__BIT B_1ms

Definition at line 28 of file usb_keyboard.c.

◆ cnt50ms

uint16_t cnt50ms

Definition at line 31 of file usb_keyboard.c.

◆ CONFIGDESC

__CODE uint8_t CONFIGDESC[41]

Definition at line 38 of file usb_keyboard.c.

◆ DEVICEDESC

__CODE uint8_t DEVICEDESC[18]
Initial value:
=
{
0x12,
0x01,
0x00,0x02,
0x00,
0x00,
0x00,
0x40,
0x54,0x53,
0x80,0x44,
0x00,0x01,
0x01,
0x02,
0x03,
0x01,
}

Definition at line 37 of file usb_keyboard.c.

◆ HidFreature

__XDATA uint8_t HidFreature[64]

Definition at line 44 of file usb_keyboard.c.

◆ HidInput

__XDATA uint8_t HidInput[64]

Definition at line 45 of file usb_keyboard.c.

◆ HidOutput

__XDATA uint8_t HidOutput[64]

Definition at line 46 of file usb_keyboard.c.

◆ HIDREPORTDESC

__CODE uint8_t HIDREPORTDESC[63]

Definition at line 39 of file usb_keyboard.c.

◆ KeyChangeFlag

__BIT KeyChangeFlag

Definition at line 30 of file usb_keyboard.c.

◆ KeyChangeTemp

__BIT KeyChangeTemp

Definition at line 29 of file usb_keyboard.c.

◆ KeyCode

uint16_t KeyCode

Definition at line 32 of file usb_keyboard.c.

◆ KeyHoldTime

uint16_t KeyHoldTime

Definition at line 35 of file usb_keyboard.c.

◆ KeyMap

__CODE uint8_t KeyMap
Initial value:
= {
0x53,
0xFF,
0xFF,
0x2A,
0x5F,
0x60,
0x61,
0x62,
0x5C,
0x5D,
0x5E,
0x63,
0x59,
0x5A,
0x5B,
0x58,
}

Definition at line 43 of file usb_keyboard.c.

◆ LANGIDDESC

__CODE uint8_t LANGIDDESC[4]
Initial value:
=
{
0x04,0x03,
0x09,0x04,
}

Definition at line 40 of file usb_keyboard.c.

◆ MANUFACTDESC

__CODE uint8_t MANUFACTDESC[8]
Initial value:
=
{
0x08,0x03,
'S',0,
'T',0,
'C',0,
}

Definition at line 41 of file usb_keyboard.c.

◆ NewKeyCode

uint16_t NewKeyCode

Definition at line 34 of file usb_keyboard.c.

◆ OldKeyCode

uint16_t OldKeyCode

Definition at line 33 of file usb_keyboard.c.

◆ PRODUCTDESC

__CODE uint8_t PRODUCTDESC[30]
Initial value:
=
{
0x1e,0x03,
'S',0,
'T',0,
'C',0,
' ',0,
'U',0,
'S',0,
'B',0,
' ',0,
'D',0,
'e',0,
'v',0,
'i',0,
'c',0,
'e',0,
}

Definition at line 42 of file usb_keyboard.c.

◆ usb_ep0_stage

USB_EP0_Stage_t usb_ep0_stage

Definition at line 48 of file usb_keyboard.c.

◆ usb_request

USB_Request_t usb_request

Definition at line 47 of file usb_keyboard.c.