2 * keyboard input routines for TOPPERS/JSP Kernel
3 * Copyright (C) 2008 Daniel Mack <daniel@caiaq.de>
5 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
6 * によって公表されている GNU General Public License の Version 2 に記
7 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
8 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
10 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
22 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
28 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
29 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
30 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35 #include <t_services.h>
38 #include "kernel_id.h"
44 static unsigned char current_state
[MAXKEYS
/8];
47 static void key_event(int key
, int state
)
49 syslog(LOG_INFO
, "KEY %03d -> %d", key
, state
);
52 static void scan_matrix(void)
54 unsigned char row
, col
, diff
, i
;
55 volatile s1c33PEPort_t
*portbase
= ((volatile s1c33PEPort_t
*) S1C33_PORT_BASE
);
57 for (row
= 1; row
< 7; row
++) {
58 unsigned char mask
= 1 << row
;
60 /* only drive one row at a time */
61 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 0) = (mask
& 0x1f);
62 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 2) = (mask
& 0xe0) >> 5;
64 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 1) = ~(mask
& 0x1f);
65 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 3) = ~(mask
& 0xe0) >> 5;
67 /* and read the input columns */
68 col
= (portbase
->stPPort
[0].bData
& 0xf0)
69 | (portbase
->stPPort
[6].bData
& 0x0f);
71 diff
= current_state
[row
] ^ col
;
75 //syslog(LOG_NOTICE, " ---> row %d diff %02x\n", row, diff);
77 for (i
= 0; i
< 8; i
++)
78 if ((diff
>> (7 - i
)) & 1)
79 key_event(row
* 8 + i
,
80 (~col
>> (7 - i
) & 1));
82 current_state
[row
] = col
;
85 /* drive all rows low again */
86 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 0) = 0x1f;
87 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 2) = 0x0f;
88 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 1) = 0;
89 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 3) = 0;
92 /* おしょくじをおたのしみください! */
93 void kint0_handler(void)
95 volatile s1c33PEPort_t
*portbase
= ((volatile s1c33PEPort_t
*) S1C33_PORT_BASE
);
96 portbase
->bScpk
[0] = portbase
->stPPort
[6].bData
& 0xf;
97 syslog(LOG_NOTICE
, "%s()", __func__
);
99 clr_int(S1C33_INHNO_KINT0
);
102 void kint1_handler(void)
104 volatile s1c33PEPort_t
*portbase
= ((volatile s1c33PEPort_t
*) S1C33_PORT_BASE
);
105 portbase
->bScpk
[1] = portbase
->stPPort
[0].bData
>> 4;
106 syslog(LOG_NOTICE
, "%s()", __func__
);
108 clr_int(S1C33_INHNO_KINT1
);
111 void keyboard_init(void)
113 volatile s1c33PEPort_t
*portbase
= ((volatile s1c33PEPort_t
*) S1C33_PORT_BASE
);
115 syslog(LOG_NOTICE
, "%s()", __func__
);
116 memset(current_state
, 0xff, sizeof(current_state
));
118 /* SSPK1[2:0] = 000 (P0[7:4])
119 * SSPK0[2:0] = 100 (P6[4:0]) */
120 portbase
->bSppk01
= 0x04;
122 /* interrupt input mask */
123 portbase
->bSmpk
[0] = 0x0f;
124 portbase
->bSmpk
[1] = 0x0f;
126 /* compare register: all 1 */
127 portbase
->bScpk
[0] = 0x0f;
128 portbase
->bScpk
[1] = 0x0f;
130 /* ROWS: set port functions for PA[0:4] and PB[0:3] to output */
131 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 0) = 0x1f;
132 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 2) = 0x0f;
134 /* ... and drive them low */
135 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 1) = 0;
136 *(IOREG
*) (S1C33_EXTPORT_BASE
+ 3) = 0;
138 /* COLUMNS: set port functions for P0[4:7] and P6[0:3] to input */
139 portbase
->stFuncSelect
[0].bCfp47
= 0;
140 portbase
->stFuncSelect
[6].bCfp03
= 0;
141 portbase
->stPPort
[0].bControl
&= 0x0f;
142 portbase
->stPPort
[6].bControl
&= 0xf0;
144 /* enable interrupts */
145 ena_int(S1C33_INHNO_KINT0
);
146 ena_int(S1C33_INHNO_KINT1
);