📄 ambakbd.c
字号:
kbdLedSet (); break; default: status = tyIoctl (&pKbdDv->tyDev, request, arg); break; } return (status); }/********************************************************************************* kbdWriteData - write data to device** This routine the write function from the I/O subsystem.** RETURNS: */LOCAL int kbdWriteData ( KBD_DEVICE * pKbdDv /* device to control */ ) { return (0); }/********************************************************************************* kbdHwInit - initialize the Keyboard* * This routine is called to do the keyboard initialization from an external* routine** RETURNS: N/A** NOMANUAL*/LOCAL void kbdHwInit (void) { UCHAR stat; pKbdDevice->kbdFlags = NUM; /* Numeric mode on */ stat = (UCHAR) (pKbdDevice->kbdFlags & 0x07); *AT91C_PIOB_PER = KBD_CLK | KBD_DATA; *AT91C_PIOB_PPUDR = KBD_CLK | KBD_DATA;/* 100K Pullup reg disable */ intDisable(AT91C_INT_LVL_PIOB); *AT91C_PIOB_IDR = 0xffffffff; /*intConnect ((VOIDFUNCPTR *)INUM_TO_IVEC (AT91C_INT_LVL_PIOB),clkFall ,0); *AT91C_AIC_SMR3 = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED + 2;*/ #if 1 at91cKBWrite(0xED);/*Set/Reset Status Indicators */ taskDelay(10); at91cKBWrite(0x00);/*Turn off all LEDs */ taskDelay(10); at91cKBWrite(0xF2);/*Read ID */ taskDelay(10); at91cKBWrite(0xED);/*Set/Reset Status Indicators */ taskDelay(10); at91cKBWrite(0x2);/*Turn on Num Lock LED 0x02*/ taskDelay(10); at91cKBWrite(0x2);/*Turn on Num Lock LED 0x02*/ taskDelay(20); at91cKBWrite(0xf4);/*Enable */ taskDelay(30); printf("finish \n ");#endif#if 0 at91cKBWrite(0xED);/*Set/Reset Status Indicators */ taskDelay(30); at91cKBWrite(0x00);/*Turn off all LEDs */ taskDelay(30); at91cKBWrite(0xF2);/*Read ID */ taskDelay(30); at91cKBWrite(0xED);/*Set/Reset Status Indicators */ printf("turn on \n"); taskDelay(30); at91cKBWrite(stat);/*Turn on Num Lock LED 0x02*/ taskDelay(30); at91cKBWrite(0xf4);/*Enable */ taskDelay(60); printf("finish \n ");#endif if (oldLedStat == stat) return; oldLedStat = stat; } /********************************************************************************* kbdIntr - interrupt level processing** This routine handles the keyboard interrupts** RETURNS: N/A** NOMANUAL*/void at91ckbdIntr (void) { UINT16 data; int oldMask;#if 0logMsg("kbd int\n",1,2,3,4,5,6);#endif oldMask = intLock(); #if 1 if((KBD_CLK_READ == 0)&&(kbdLab != 0)) /*fall-readbyte */ { data = KBD_DATA_READ; switch(kbdLab) { case 1: /*ack*/ if(data==0) { kbdLab = 2; } break; case 2: /*after ack*/ switch(kbdBitCnt) { case 0: kbdParity = 0; /*for odd parity*/ scanCode = 0; if(data == 0) /*start bit*/ kbdBitCnt++; else { intUnlock(oldMask); return; } break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:/*in_char*/ kbdBitCnt++; scanCode |= data<< (kbdBitCnt -2); kbdParity += data; break; case 9: kbdBitCnt++; kbdParity += data; if((kbdParity & 1) == 0) /*parity bit wrong*/ { kbdBitCnt=0; } break; case 10: /*stop bit*/ kbdBitCnt =0; if(data!= 0) { logMsg("K-%02x\n",scanCode,2,3,4,5,6); /* keyboard acknowledge to any valid input, so just return */ if (scanCode != 0xfa) { tyIRd (&(pKbdDevice->tyDev), scanCode); } } break; default: kbdBitCnt=0; break; } break; default: break; } }#if 0 else if(kbdLab==0) { kbdBitCnt2++; if(kbdBitCnt2<=8) /*scanCode 1-8*/ { KBD_DATA_WRITE(kbdByte2&1); kbdParity2 += kbdByte2; kbdByte2 = kbdByte2 >>1; } else if(kbdBitCnt2 == 9)/*parity */ { KBD_DATA_WRITE(kbdParity2 & 1); } else if(kbdBitCnt2 == 10)/*stop */ { KBD_DATA_WRITE(1); kbdLab = 1; kbdBitCnt2 = 0; KBD_DATA_INPUT;/*data release ,data as input*/ } }#endif #endif intUnlock(oldMask); }/******************************************************************************** kbdLedSet - Keybord LED Set** This routine Keyboad LED control on kbdConDv.kbdFlags numeric, caps and* stps** RETURNS: N/A*/LOCAL void kbdLedSet (void) { UCHAR stat = 0; /* bits 0 1 2 for scroll numlock & capslock */ stat = (UCHAR) (pKbdDevice->kbdFlags & 0x07); if (oldLedStat == stat) return; oldLedStat = stat; at91cKBWrite(0xED);/*Set/Reset Status Indicators */ taskDelay(10); at91cKBWrite(stat); }LOCAL void kbdWaitForCLK(int value)/*0,1 wait about 40us */{ int i=0; while ((KBD_CLK_READ != value) && (i++<2000));/* Wait for clk */}LOCAL void kbdWriteBit(UCHAR b) /*rise edge*/{ kbdWaitForCLK(0); KBD_DATA_WRITE(b); kbdWaitForCLK(1);}/******************************************************************************** ambaKBWrite - write data to the keyboard.** Write data to the keyboard.** RETURNS: OK or ERROR if timed out*/STATUS at91cKBWrite ( UCHAR value ) { int i=0; UCHAR p=1; KBD_INT_DISABLE;/*此处最好添加相应是否有数据收程序*/ KBD_CLK_OUTPUT; /*clk,data as output*/ KBD_DATA_OUTPUT; KBD_CLK_WRITE(0);/*clk=0*/ KBD_DATA_WRITE(0);/*start bit=0*/ taskDelay(1);/*wait > 100us*/ KBD_CLK_INPUT; for(i=0;i<8;i++) { kbdWriteBit(value & 1); /*bit write*/ p = p + value; value = value >> 1; } kbdWriteBit(p & 1);/*check*/ kbdWriteBit(1); /*stop bit =1*/ KBD_DATA_INPUT;/*data release ,data as input*/ kbdLab = 2; /*表示直接接收数据*/ kbdBitCnt = 0; return OK; }/******************************************************************************** kbdWdog - KBD driver watchdog handler.** KBD driver watchdog handler.** RETURNS: N/A*/LOCAL void kbdWdog ( void ) { }/********************************************************************************* kbdDelay - pause* * This routine is called to introduce some delay** RETURNS: N/A** NOMANUAL*/LOCAL void kbdDelay(void) { taskDelay (sysClkRateGet () >> 3); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -