From 9725c2819af497171e0aa65f4de6ef8d21987e66 Mon Sep 17 00:00:00 2001 From: lephe Date: Thu, 5 May 2016 18:19:10 +0200 Subject: [PATCH] Moved the keyboard to timers. Minor changes in multigetkey() to avoid unwanted event repeats. Beginning of a test application. --- TODO | 8 +-- ginttest.c | 124 +++++++++++++++++++++++++++++++++++++-------- ginttest.g1a | Bin 12280 -> 13652 bytes include/gint.h | 23 +++++++-- include/keyboard.h | 88 ++++++++++++++++++++++---------- include/timer.h | 17 ++++--- libc.a | Bin 1770 -> 1770 bytes libgint.a | Bin 22334 -> 23548 bytes src/gint_7305.c | 50 ++++++++---------- src/gint_7705.c | 58 ++++++++++----------- src/keyboard.c | 89 +++++++++++++++++++++++++------- src/timer.c | 4 +- 12 files changed, 320 insertions(+), 141 deletions(-) diff --git a/TODO b/TODO index eb9bb0a..360005e 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,9 @@ -- screen, display -- timer -- gray engine +- multi-getkey repeats (if possible, which doesn't seem likely) +- getkey() may unwantedly repeat a key if it was triggered for multigetkey() + +- write and test gray engine - full rtc driver (time) +- callbacks and complete user API _ 7305.h _ libc diff --git a/ginttest.c b/ginttest.c index 5133959..3211a45 100644 --- a/ginttest.c +++ b/ginttest.c @@ -3,11 +3,26 @@ #include #include #include +#include + +extern unsigned int gint_vbr, bgint, egint, gint_data; + +/* + A few procedures for displaying text in the system's vram. +*/ extern void __Print(const char *msg, int x, int y); -extern unsigned int gint_vbr, bgint, egint, gint_data; -#define print __Print +void print_clear(void) +{ + char *empty_line = " "; + int i = 0; + while(i < 8) print(empty_line, 0, i++); +} +void print(const char *str, int x, int y) +{ + __Print(str, x, y); +} void print_hex(unsigned int n, int x, int y) { char ch[11] = "0x"; @@ -19,7 +34,7 @@ void print_hex(unsigned int n, int x, int y) n >>= 4; } ch[10] = 0; - print(ch, x, y); + __Print(ch, x, y); } void print_bin(unsigned char n, int x, int y) { @@ -32,9 +47,8 @@ void print_bin(unsigned char n, int x, int y) n >>= 1; } ch[8] = 0; - print(ch, x, y); + __Print(ch, x, y); } - void print_hexa(unsigned int n, int digits, int x, int y) { char ch[20]; @@ -47,29 +61,35 @@ void print_hexa(unsigned int n, int digits, int x, int y) } ch[digits] = 0; - print(ch, x, y); + __Print(ch, x, y); } -// Don't forget to enable key state debugging in the interrupt handler. +/* + Keyboard tests. +*/ + void keyboard_test(void) { - const char *names[] = { - "MPU_Unkown", - "MPU_SH7337", - "MPU_SH7355", - "MPU_SH7305", - "MPU_SH7724", - "Error" - }; +/* + print_bin(keyboard_state[0], 0, 2); + print_bin(keyboard_state[1], 0, 3); + print_bin(keyboard_state[2], 0, 4); + print_bin(keyboard_state[3], 0, 5); + print_bin(keyboard_state[4], 0, 6); + + print_bin(keyboard_state[5], 9, 2); + print_bin(keyboard_state[6], 9, 3); + print_bin(keyboard_state[7], 9, 4); + print_bin(keyboard_state[8], 9, 5); + print_bin(keyboard_state[9], 9, 6); +*/ + int x = 0; char str[3]; int keys[4] = { 0 }; int i; - print(names[MPU_CURRENT < 5 ? MPU_CURRENT : 5], 0, 0); - - print("gint size:", 0, 1); - print_hex(&egint - &bgint, 11, 1); + print_clear(); while(1) { @@ -251,7 +271,7 @@ void btest_gint_icon(void) } */ -int main(void) +void bitmap_test(void) { extern Image binary_symbol_start; extern Image binary_symbol2_start; @@ -307,5 +327,69 @@ int main(void) dupdate(); while(getkey() != KEY_EXE); +} + +void test(void) +{ + static int x = 0; + x++; + + print_hex(x, 0, 0); +} + +int main_menu(void) +{ + /* + Main menu. + */ + + const char *mpu_names[] = { + "MPU_Unkown", + "MPU_SH7337", + "MPU_SH7355", + "MPU_SH7305", + "MPU_SH7724", + "MPU Error !" + }; + int key; + + print_clear(); + + print("gint test application", 0, 0); + print("---------------------", 0, 1); + + print("[1] Keyboard test", 2, 3); + print("[2] Drawing test", 2, 4); + + print("mpu type:", 0, 6); + print(mpu_names[MPU_CURRENT < 5 ? MPU_CURRENT : 5], 11, 6); + print("gint size:", 0, 7); + print_hex(&egint - &bgint, 11, 7); + + while(1) + { + key = getkey(); + if(key == KEY_EXIT) return 0; + + if(key == KEY_1) return 1; + if(key == KEY_2) return 2; + } + + return 0; +} + +int main(void) +{ + int app; + + while(1) + { + app = main_menu(); + if(!app) break; + + if(app == 1) keyboard_test(); + if(app == 2) bitmap_test(); + } + return 0; } diff --git a/ginttest.g1a b/ginttest.g1a index 4e1e26dab8d08e415340984d5e54f5c3eb3337f4..ab2465188f8691e80912dc21c73c09f49836ec55 100644 GIT binary patch delta 4748 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 delta 3428 zcmai04NP0t6~5Qc4t_R2wz0tl2mJg4xFNiUVF{?wYA4XV6yhj7kO^@r9&u~W5Ie-Ffe1#K zz;+CAX%kU-oyDa_v`8_sx*`N4c({x|6Q78a-9cR8Zg#fL5}0oN!ISiVt=$1{;Y&)C z(F4Lc`Fn)%ir7!-0ms}t4tzmyt;r1> z_UNV*8bM=y#JGeY04So+nbQRcz(0oY6zM88-tOHP{^> z8c!0wl7rN;Bzbj-jZRIs!jo*!GRAHkd7Iey7a9t^+3lE&l3AAOOf9<%nxvE>YkrdZ z=#m5f!W7b$MOqN;O-j1?HEZ#Lpi0}AyUP zBS4pyN<gj=1Fos zc?aM#N%T?)2I_xD)Jn=6a0Lm0ah4=&$Qx`WX~i~y`0SUJ_m=@WCIa*^;`FZ}&QOZD z{OD5GW!C`KfjHgAN{tqY)D)_-Fcy)OO;B$23|?xrwV#s~6e&<`7O5o-qVLxUZ>SHG z##Q?em!2*})ekX5ib6XgcDD5gk@D#H?6%~}z5stUf-n7*0{e@k{9wuvh-?GkE;t2X zo2V-VO-3;d8LH%xu6dC<`54CZuJ z1aspk$OJ9HBf*Z~OTqG>Gg#5dc&PX-^8>wWF493JUVXHH?9qGid$1H}t02#OC}ZmY zoHPSzse9ssv30^@nU4iTV{n64D;gO_Gy$2rFzhSlAM32X+VKOkc9mu{H z6?SI@+)c~wh#TULxFPO{8{&?5A>N1=;*EGA-Wq`uZ(hNq@dd7APT>UXDBenSSgX3_ zZcX@~?HH-!NK|4IZyLklv;;!5iy6bAyMF9ex|O^Ysm=LhL!b_nzts4moY#PbEN&xm zROVW@tmiU0_IRyP zV@Sgv@;q7I;XSk&LY9~K@4D&A(j@X@n-gsA{zA?lI(yT%5@@{EQCDu4|Lg`ajRC;v& z6x<6+F|9_)Yig9^VVjz95$j$&v{<9Oca0o{P{eCB+VGlM;nx~V0QRHdl5Oh=nJDw< zY&ubf)VvN{_W-@Y9xrNP`>vA}gz`PFFvifo z6KI>EIBO8Sg-6H{wk3DX0Wc&6#xfGY3luqe|FlIMjPsLFozM0~0Uu_tZ9r&>Dy|3!O zX*l_21kc}>ONnlqfsa(@jo}j&tua2?W$Vt5Zgr`flAhZxrAuixhO!*}leH7I9&htz zKdJb}B3*O~FXM8%1KSYo=tp$-)!(#5RDAMpw%Dcws{h`ii&d|mDpOl@d@_(uuATp$ zT(r^!D{WS`QsMQU7%U3K--g`=)>ldsXuZzSU#y!)S4zU?igiOG>{AB`7rN-^k7!@O zqM4ZzEkNb~GxfjRzkn0S_QcSiige{D^k&0t2$0^@5?1k_cD00lSO2}Ef4=1}N5k4e zJOtM^gqELp8)m+@I|3GaLw%CPUh{_`8CV=Z^iU6?F+wS+Rl1-u9i-xj(=gL8cnt`) zfZ-C9ivu2w!XJfe-EkPcE>~%8kSrO@Ik)_V`eiM8zw|NA#<+- z4Y!t@9sQyriM+aAgsQ0=S7pi^84a z0xrs$DEB(}iR1K5Kt55%!@hSZ!KOf|k@rKBL_{hk_vpwU3sTo>NtVkv*!pDS6wFgb zF!p%d#rA!R+0)nMefc-izR0+e$zHgL?8D!gZ(_I34HtioNyT;^KGgz8X!YEwuFz<}1e2yp*$a@8w6=PvOlO{IQ_c zTij{#mYVln+$r>MdBV~1v@G~%=wabXGyysYVE|8`OF4Xd>xco^nB`{Ufn5f1CBVn^ry z#ZHR;l{v@JwYG2CF8f{=-xS5RN#7OUTc1b#EfkkNO=Z?(*tc67nzeR^{VdZUL^-2o z2G@pozUk?i5j$<)QB*Jd-f59HqvqX`wyE6au${HKo3w;8?jOOE%iu`>M=J8Fnx7sY zDMC9mysra~j}#;RSmslqLoecqs-9iz@l48A-&_u1PcDZ)$u#ghpMLRS;hfWAn^9Cf zP1GTo{p`?l{4r|-|7o+9q-=LU&S&l0AzO%&GlR)DMX2_(CLd37-ey-9*ORra+kJP delta 36 jcmaFG`-*phEUSsRsfE!*rCbPO-E diff --git a/libgint.a b/libgint.a index 5af816a41d190f59ec47824583012a8825ada2cf..82f815bbb16ae8095cfcf035ac5766bd1f6d87f1 100644 GIT binary patch delta 5024 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 OW}rJnLor$eH~tGl$fwl+ delta 4258 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 diff --git a/src/gint_7305.c b/src/gint_7305.c index 0947749..25330e9 100644 --- a/src/gint_7305.c +++ b/src/gint_7305.c @@ -1,17 +1,17 @@ #include +#include +#include #include <7305.h> -extern void print_hex(unsigned int value, int x, int y); -extern void print_bin(unsigned char value, int x, int y); - - - //--- // Interrupt codes. //--- #define IC_RTC_PRI 0xaa0 #define IC_KEYSC 0xbe0 +#define IC_TMU0_TUNI0 0x400 +#define IC_TMU0_TUNI1 0x420 +#define IC_TMU0_TUNI2 0x440 @@ -19,9 +19,6 @@ extern void print_bin(unsigned char value, int x, int y); // Keyboard management. //--- -extern volatile unsigned char keyboard_state[10]; -extern void keyboard_interrupt(void); - /* kdelay() Should sleep during a few milliseconds. Well... @@ -143,16 +140,14 @@ static int krow(int row) } /* - kstate() + keyboard_updateState() Updates the keyboard state. */ -static void kstate(void) +void keyboard_updateState_7305(volatile unsigned char *keyboard_state) { int i; for(i = 0; i < 10; i++) keyboard_state[i] = krow(i); - - keyboard_interrupt(); } @@ -169,23 +164,19 @@ void gint_7305(void) switch(code) { case IC_RTC_PRI: - // Clearing the interrupt flag. RTC.RCR2.PEF = 0; - // Updating the keyboard state. - kstate(); -/* - print_bin(keyboard_state[0], 0, 2); - print_bin(keyboard_state[1], 0, 3); - print_bin(keyboard_state[2], 0, 4); - print_bin(keyboard_state[3], 0, 5); - print_bin(keyboard_state[4], 0, 6); + break; - print_bin(keyboard_state[5], 9, 2); - print_bin(keyboard_state[6], 9, 3); - print_bin(keyboard_state[7], 9, 4); - print_bin(keyboard_state[8], 9, 5); - print_bin(keyboard_state[9], 9, 6); -*/ + case IC_TMU0_TUNI0: + timer_interrupt(TIMER_TMU0); + break; + + case IC_TMU0_TUNI1: + timer_interrupt(TIMER_TMU1); + break; + + case IC_TMU0_TUNI2: + timer_interrupt(TIMER_TMU2); break; } } @@ -245,7 +236,10 @@ static void gint_priority_lock_7305(void) // Allowing RTC. Keyboard analysis is done regularly using a RTC // because SH7305's special KEYSC interface does not allow us to clear // the keyboard interrupt flags. - INTX.IPRK._RTC = GINT_INTP_RTC; + INTX.IPRK._RTC = GINT_INTP_RTC; + INTX.IPRA.TMU0_0 = GINT_INTP_KEY; + INTX.IPRA.TMU0_1 = GINT_INTP_GRAY; + INTX.IPRA.TMU0_2 = GINT_INTP_TIMER; } static void gint_priority_unlock_7305(void) diff --git a/src/gint_7705.c b/src/gint_7705.c index 02ff8b2..563958b 100644 --- a/src/gint_7705.c +++ b/src/gint_7705.c @@ -1,17 +1,17 @@ #include +#include +#include #include <7705.h> -extern void print_hex(unsigned int value, int x, int y); -extern void print_bin(unsigned char value, int x, int y); - - - //--- // Interrupt codes. //--- #define IC_RTC_PRI 0x4a0 #define IC_PINT07 0x700 +#define IC_TMU0_TUNI0 0x400 +#define IC_TMU1_TUNI1 0x420 +#define IC_TMU2_TUNI2 0x440 @@ -19,12 +19,11 @@ extern void print_bin(unsigned char value, int x, int y); // Keyboard management. //--- -extern volatile unsigned char keyboard_state[10]; -extern void keyboard_interrupt(void); - /* kdelay() - Low-level sleep using the watchdog. + Used to be a low-level sleep using the watchdog, as in the system. This + way seems ok at least, and it doesn't create column effects as for + SH7305. */ static void kdelay(void) { @@ -39,7 +38,7 @@ static void kdelay(void) #undef r4 -/* + /* Watchdog version. const int delay = 0xf4; // Disabling the watchdog timer interrupt and resetting the @@ -64,7 +63,7 @@ static void kdelay(void) // Enabling back the watchdog timer interrupt. INTC.IPRB.BIT._WDT = GINT_INTP_WDT; -*/ + */ } /* @@ -134,16 +133,14 @@ static int krow(int row) } /* - kstate() + keyboard_updateState() Updates the keyboard state. */ -static void kstate(void) +void keyboard_updateState_7705(volatile unsigned char *keyboard_state) { int i; for(i = 0; i < 10; i++) keyboard_state[i] = krow(i); - - keyboard_interrupt(); } @@ -160,23 +157,19 @@ void gint_7705(void) switch(code) { case IC_RTC_PRI: - // Clearing the interrupt flag. RTC.RCR2.BIT.PEF = 0; - // Updating the keyboard state. - kstate(); -/* - print_bin(keyboard_state[0], 0, 2); - print_bin(keyboard_state[1], 0, 3); - print_bin(keyboard_state[2], 0, 4); - print_bin(keyboard_state[3], 0, 5); - print_bin(keyboard_state[4], 0, 6); + break; - print_bin(keyboard_state[5], 9, 2); - print_bin(keyboard_state[6], 9, 3); - print_bin(keyboard_state[7], 9, 4); - print_bin(keyboard_state[8], 9, 5); - print_bin(keyboard_state[9], 9, 6); -*/ + case IC_TMU0_TUNI0: + timer_interrupt(TIMER_TMU0); + break; + + case IC_TMU1_TUNI1: + timer_interrupt(TIMER_TMU1); + break; + + case IC_TMU2_TUNI2: + timer_interrupt(TIMER_TMU2); break; } } @@ -214,7 +207,10 @@ static void gint_priority_lock_7705(void) INTX.IPRH.WORD = 0x0000; // Allowing RTC, which handles keyboard. - INTC.IPRA.BIT._RTC = GINT_INTP_RTC; + INTC.IPRA.BIT._RTC = GINT_INTP_RTC; + INTC.IPRA.BIT._TMU0 = GINT_INTP_KEY; + INTC.IPRA.BIT._TMU1 = GINT_INTP_GRAY; + INTC.IPRA.BIT._TMU2 = GINT_INTP_TIMER; } static void gint_priority_unlock_7705(void) diff --git a/src/keyboard.c b/src/keyboard.c index 8b3985a..0ec7a0e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1,14 +1,18 @@ #include +#include #include //--- // Keyboard variables. //--- -volatile unsigned char keyboard_state[10] = { 0 }; +// These ones get modified by interrupts. +static volatile unsigned char keyboard_state[10] = { 0 }; +static volatile int interrupt_flag = 0; + +// Key statistics. static int repeat_first = 10, repeat_next = 2; static int last_key = KEY_NONE, last_repeats = 0, last_events = 0; -static volatile int interrupt_flag = 0; @@ -18,9 +22,9 @@ static volatile int interrupt_flag = 0; /* sleep() - Puts the CPU in sleep mode and waits for an interrupt to return. + Puts the CPU to sleep and waits for an interrupt. */ -void sleep(void) +static void sleep(void) { __asm__ ( @@ -34,7 +38,7 @@ void sleep(void) @return A pressed key. */ -int getPressedKey(void) +static int getPressedKey(void) { int row = 1, column = 0; int state; @@ -62,7 +66,7 @@ int getPressedKey(void) @return Number of actual pressed keys found. */ -int getPressedKeys(int *keys, int count) +static int getPressedKeys(int *keys, int count) { int row = 1, column; int found = 0, actually_pressed; @@ -109,16 +113,46 @@ int getPressedKeys(int *keys, int count) return actually_pressed; } + + +//--- +// Interrupt management. +//--- + /* keyboard_interrupt() Callback for keyboard update. Allows keyboard analysis functions to - wake only when RTC interrupts happen. + wake only when keyboard interrupts happen. */ void keyboard_interrupt(void) { + if(isSH3()) + keyboard_updateState_7705(keyboard_state); + else + keyboard_updateState_7305(keyboard_state); + interrupt_flag = 1; } +/* + keyboard_init() + Starts the keyboard timer. +*/ +void keyboard_init(void) +{ + timer_start(TIMER_KEYBOARD, 1700, TIMER_Po_256, keyboard_interrupt, + 0); +} + +/* + keyboard_quit() + Stops the keyboard timer. +*/ +void keyboard_quit(void) +{ + timer_stop(TIMER_KEYBOARD); +} + //--- @@ -127,20 +161,12 @@ void keyboard_interrupt(void) /* keyboard_setFrequency() - Sets the keyboard frequency. Does nothing when the argument is not a - valid KeyboardFrequency value. + Sets the keyboard frequency. - @arg frequency + @arg frequency In Hz. */ -void keyboard_setFrequency(enum KeyboardFrequency frequency) +void keyboard_setFrequency(int frequency) { - volatile unsigned char *rcr2; - - if(frequency < 1 || frequency > 7) return; - rcr2 = (unsigned char *)(isSH3() ? 0xfffffede : 0xa413fede); - - frequency <<= 4; - *rcr2 = (*rcr2 & 0x8f) | frequency; } /* @@ -185,6 +211,21 @@ int keylast(int *repeat_count) +/* + keystate() + Returns the address of the keyboard state array. The returned address + if the handler's buffer, therefore it contains volatile data. + + @return 10-byte keyboard state buffer. +*/ +volatile unsigned char *keystate(void) +{ + return keyboard_state; +} + + + + /* getkey() Blocking function with auto-repeat and SHIFT modifying functionalities. @@ -330,6 +371,18 @@ void multigetkey(int *keys, int count, int max_cycles) if(max_cycles > 0) max_cycles--; number = getPressedKeys(keys, count); + + // We need to update the last key data, in case multigetkey() + // returns a single key, and getkey() is called a short time + // after. Otherwise getkey() could re-send an event for this + // key. + if(number == 1) + { + last_key = keys[0]; + last_repeats = 0; + last_events = 0; + } + if(number) return; // Handle key repetitions. diff --git a/src/timer.c b/src/timer.c index f05b1a0..d7afc15 100644 --- a/src/timer.c +++ b/src/timer.c @@ -77,7 +77,7 @@ void timer_get(int timer, struct mod_tmu **tmu, unsigned char **tstr) } /* - timer_set() + timer_start() Configures and starts a timer. @arg timer Timer identifier. @@ -86,7 +86,7 @@ void timer_get(int timer, struct mod_tmu **tmu, unsigned char **tstr) @arg callback Callback function. @arg repetitions Number of repetitions, 0 for infinite. */ -void timer_set(int timer, int delay, int prescaler, void (*callback)(void), +void timer_start(int timer, int delay, int prescaler, void (*callback)(void), int repetitions) { // Getting the timer address. Using a byte to alter TSTR.