INT NTAPI LlbHwKbdRead(VOID) { UCHAR ActiveCol = 0, ActiveRow = 0, col, coldata, row; for (col = 0; col < 8; col++) { coldata = LlbHwOmap3TwlRead1(0x4A, 0xDB + col); if (coldata) { for (row = 0; row < 8; row++) { if (coldata == (1 << row)) { ActiveRow = row; ActiveCol = col; break; } } } } return ((ActiveCol << 4) | ActiveRow); }
BOOLEAN NTAPI LlbHwKbdReady(VOID) { UCHAR Value; Value = LlbHwOmap3TwlRead1(0x4A, 0xE3); if (!Value) return FALSE; LastState ^= 1; if (!LastState) return FALSE; /* Return whether or not an interrupt is pending */ return TRUE; }
ULONG LlbHwRtcRead(VOID) { /* Issue the GET_TIME request on the RTC control register */ LlbHwOmap3TwlWrite1(0x4B, 0x29, 0x41); /* Read the BCD registers and convert them */ LlbTime.Second = BCD_INT(LlbHwOmap3TwlRead1(0x4B, 0x1C)); LlbTime.Minute = BCD_INT(LlbHwOmap3TwlRead1(0x4B, 0x1D)); LlbTime.Hour = BCD_INT(LlbHwOmap3TwlRead1(0x4B, 0x1E)); LlbTime.Day = BCD_INT(LlbHwOmap3TwlRead1(0x4B, 0x1F)); LlbTime.Month = BCD_INT(LlbHwOmap3TwlRead1(0x4B, 0x20)); LlbTime.Year = BCD_INT(LlbHwOmap3TwlRead1(0x4B, 0x21)); LlbTime.Year += (LlbTime.Year > 80) ? 1900 : 2000; return 0; }
VOID NTAPI LlbHwOmap3SynKpdInitialize(VOID) { /* Set GPIO pin 8 on the TWL4030 as an output pin */ LlbHwOmap3TwlWrite1(0x49, 0x9B, 0xC0); /* Set GPIO pin 8 signal on the TWL4030 ON. This powers the keypad backlight */ LlbHwOmap3TwlWrite1(0x49, 0xA4, 0xC0); /* Set PENDDIS and COR on the the keypad interrupt controller */ LlbHwOmap3TwlWrite1(0x4A, 0xE9, 0x06); /* Only falling edge detection for key pressed */ LlbHwOmap3TwlWrite1(0x4A, 0xE8, 0x01); /* Unmask key-pressed events */ LlbHwOmap3TwlWrite1(0x4A, 0xE4, 0x0E); /* Set the keypad control register to turn hardware sequencing and turn it on */ LlbHwOmap3TwlWrite1(0x4A, 0xD2, 0x0); LlbHwOmap3TwlRead1(0x4A, 0xE3); LlbHwOmap3TwlWrite1(0x4A, 0xD2, 0x43); }