Tue, 01 Mar 2011 21:33:32 +0000
Add keyboard patch from Andrew Warkentin <andreww591 gmail com>
I fixed the keyboard in FreeBee. I looked at the keyboard driver source available on a few sites, and it appears that BEGKBD/KEY_BEGIN_KEYBOARD is only supposed to be sent after the end of mouse data, and that KLAST/KEY_LIST_END is not a separate code, but a flag that is set on the last non-KALLUP/KEY_ALL_UP code in a list. I have attached a patch that implements these changes. I have also attached a patch that adds the 60Hz timer interrupt (I'm not sure if it's totally correct, though, since the cursor blinks rather slowly).
Received-From: Andrew Warkentin <andreww591 gmail com>
Signed-Off-By: Philip Pemberton <philpem@philpem.me.uk>
1 #ifndef _MEMORY_H
2 #define _MEMORY_H
4 /***********************************
5 * Array read/write utility macros
6 * "Don't Repeat Yourself" :)
7 ***********************************/
9 /// Array read, 32-bit
10 #define RD32(array, address, andmask) \
11 (((uint32_t)array[(address + 0) & (andmask)] << 24) | \
12 ((uint32_t)array[(address + 1) & (andmask)] << 16) | \
13 ((uint32_t)array[(address + 2) & (andmask)] << 8) | \
14 ((uint32_t)array[(address + 3) & (andmask)]))
16 /// Array read, 16-bit
17 #define RD16(array, address, andmask) \
18 (((uint32_t)array[(address + 0) & (andmask)] << 8) | \
19 ((uint32_t)array[(address + 1) & (andmask)]))
21 /// Array read, 8-bit
22 #define RD8(array, address, andmask) \
23 ((uint32_t)array[(address + 0) & (andmask)])
25 /// Array write, 32-bit
26 #define WR32(array, address, andmask, value) do { \
27 array[(address + 0) & (andmask)] = (value >> 24) & 0xff; \
28 array[(address + 1) & (andmask)] = (value >> 16) & 0xff; \
29 array[(address + 2) & (andmask)] = (value >> 8) & 0xff; \
30 array[(address + 3) & (andmask)] = value & 0xff; \
31 } while (0)
33 /// Array write, 16-bit
34 #define WR16(array, address, andmask, value) do { \
35 array[(address + 0) & (andmask)] = (value >> 8) & 0xff; \
36 array[(address + 1) & (andmask)] = value & 0xff; \
37 } while (0)
39 /// Array write, 8-bit
40 #define WR8(array, address, andmask, value) do { \
41 array[(address + 0) & (andmask)] = value & 0xff; \
42 } while (0)
44 /******************
45 * Memory mapping
46 ******************/
48 typedef enum {
49 MEM_ALLOWED = 0,
50 MEM_PAGEFAULT, // Page fault -- page not present
51 MEM_PAGE_NO_WE, // Page not write enabled
52 MEM_KERNEL, // User attempted to access kernel memory
53 MEM_UIE // User Nonmemory Location Access
54 } MEM_STATUS;
56 /**
57 * @brief Check memory access permissions for a given address.
58 * @param addr Address.
59 * @param writing true if writing to memory, false if reading.
60 * @return One of the MEM_STATUS constants, specifying whether the access is
61 * permitted, or what error occurred.
62 */
63 MEM_STATUS checkMemoryAccess(uint32_t addr, bool writing);
65 /**
66 * @brief Map a CPU memory address into physical memory space.
67 * @param addr Address.
68 * @param writing true if writing to memory, false if reading.
69 * @return Address, remapped into physical memory.
70 */
71 uint32_t mapAddr(uint32_t addr, bool writing);
73 #endif