source: autosar_os_training/trunk/driver/device.c@ 124

Last change on this file since 124 was 124, checked in by ertl-honda, 9 years ago

AUTOSAR OS教材用のファイルをコミット.

File size: 4.2 KB
Line 
1#include "Os.h"
2#include "device.h"
3#include "prc_sil.h"
4
5/*
6 * LED接続ポート
7 *
8 * 拡張I/OボードのLED1-3はプログラマブル入出力ポート4に
9 * 次のように接続されている.
10 * D1 : P8_4
11 * D2 : P8_5
12 * D3 : P8_6
13 * D4 : P8_7
14 */
15
16#define LED1_PORT 0x10
17#define LED2_PORT 0x20
18#define LED3_PORT 0x40
19#define LED4_PORT 0x80
20
21#define LED_PORT_MASK (LED4_PORT|LED3_PORT|LED2_PORT|LED1_PORT)
22
23/*
24 * LED接続ポート初期化
25 */
26void
27led_init(void){
28 uint16 wk;
29
30 /* PMC8 設定 */
31 wk = sil_reh_mem((void *) PMC(8));
32 wk &= ~LED_PORT_MASK;
33 sil_wrh_mem((void *) PMC(8), wk);
34
35 /* PM8 設定 */
36 wk = sil_reh_mem((void *) PM(8));
37 wk &= ~LED_PORT_MASK;
38 sil_wrh_mem((void *) PM(8), wk);
39
40 /* All Off */
41 led_out(LED_OFF);
42}
43
44
45/*
46 * LED接続ポート書き込み
47 */
48void
49led_out(uint8 led_data){
50 uint16 wk;
51 uint16 ptn = 0;
52
53 if (led_data & LED1){
54 ptn |= LED1_PORT;
55 }
56 if (led_data & LED2){
57 ptn |= LED2_PORT;
58 }
59 if (led_data & LED3){
60 ptn |= LED3_PORT;
61 }
62 if (led_data & LED4){
63 ptn |= LED4_PORT;
64 }
65
66 ptn = ~ptn & LED_PORT_MASK;
67 wk = sil_reh_mem((void *) P(8));
68 wk &= ~LED_PORT_MASK;
69 wk |= ptn;
70 sil_wrh_mem((void *) P(8), wk);
71}
72
73
74/*
75 * DIPスイッチ接続ポート
76 *
77 * 拡張I/OボードのSW1-4はプログラマブル入出力ポート
78 * にインバータを介して接続されている.
79 * DSW1 : P0_7
80 * DSW2 : P0_8
81 * DSW3 : P0_9
82 * DSW4 : P0_10
83 */
84
85#define DSW1_PORT 0x0080
86#define DSW2_PORT 0x0100
87#define DSW3_PORT 0x0200
88#define DSW4_PORT 0x0400
89
90#define DSW_PORT_MASK (DSW4_PORT|DSW3_PORT|DSW2_PORT|DSW1_PORT)
91
92/*
93 * DIPスイッチ接続ポート初期化
94 */
95void
96switch_dip_init(void){
97 uint16 wk;
98
99 /* PMC0 設定 */
100 wk = sil_reh_mem((void *) PMC(0));
101 wk &= ~DSW_PORT_MASK;
102 sil_wrh_mem((void *) PMC(0), wk);
103
104 /* PM0 設定 */
105 wk = sil_reh_mem((void *) PM(0));
106 wk |= DSW_PORT_MASK;
107 sil_wrh_mem((void *) PM(0), wk);
108
109 /* PIBC0 設定 */
110 wk = sil_reh_mem((void *) PIBC(0));
111 wk |= DSW_PORT_MASK;
112 sil_wrh_mem((void *) PIBC(0), wk);
113}
114
115/*
116 * DIPスイッチ状態の読み込み
117 */
118uint8
119switch_dip_sense(void){
120 uint16 wk;
121 uint16 ptn = 0;
122
123 wk = sil_reh_mem((void *) PPR(0));
124
125 if (!(wk & DSW1_PORT)){
126 ptn |= DSW1;
127 }
128 if (!(wk & DSW2_PORT)){
129 ptn |= DSW2;
130 }
131 if (!(wk & DSW3_PORT)){
132 ptn |= DSW3;
133 }
134 if (!(wk & DSW4_PORT)){
135 ptn |= DSW4;
136 }
137
138 return(ptn);
139}
140
141
142/*
143 * PUSHスイッチ接続ポート
144 *
145 * PSW1 : P8_0 (INTP4) : 第3兼用
146 * PSW2 : P8_1 (INTP5) : 第3兼用
147 */
148#define PSW1_PORT 0x0001
149#define PSW2_PORT 0x0002
150#define PSW_PORT_MASK 0x0003
151
152#define PSW_PORT_PFCAE_INIT 0x0000
153#define PSW_PORT_PFCE_INIT 0x0003
154#define PSW_PORT_PFC_INIT 0x0000
155#define PSW_PORT_PMC_INIT 0x0003
156#define PSW_PORT_PM_INIT 0x0003
157#define PSW_PORT_PIBC_INIT 0x0003
158
159#define FCLA0CTL4_INTPL 0xFFC34030
160#define FCLA0CTL5_INTPL 0xFFC34034
161
162/*
163 * PUSHスイッチ接続ポート初期化
164 */
165void
166switch_push_init(void){
167 uint16 wk;
168
169 /* PFCAE8 設定 */
170 wk = sil_reh_mem((void *) PFCAE(8));
171 wk &= ~PSW_PORT_MASK;
172 wk |= (PSW_PORT_PFCAE_INIT & PSW_PORT_MASK);
173 sil_wrh_mem((void *) PFCAE(8), wk);
174
175 /* PFCE8 設定 */
176 wk = sil_reh_mem((void *) PFCE(8));
177 wk &= ~PSW_PORT_MASK;
178 wk |= (PSW_PORT_PFCE_INIT & PSW_PORT_MASK);
179 sil_wrh_mem((void *) PFCE(8), wk);
180
181 /* PFC8 設定 */
182 wk = sil_reh_mem((void *) PFC(8));
183 wk &= ~PSW_PORT_MASK;
184 wk |= (PSW_PORT_PFC_INIT & PSW_PORT_MASK);
185 sil_wrh_mem((void *) PFC(8), wk);
186
187 /* PMC8 設定 */
188 wk = sil_reh_mem((void *) PMC(8));
189 wk &= ~PSW_PORT_MASK;
190 wk |= (PSW_PORT_PMC_INIT & PSW_PORT_MASK);
191 sil_wrh_mem((void *) PMC(8), wk);
192
193 /* PM8 設定 */
194 wk = sil_reh_mem((void *) PM(8));
195 wk &= ~PSW_PORT_MASK;
196 wk |= (PSW_PORT_PM_INIT & PSW_PORT_MASK);
197 sil_wrh_mem((void *) PM(8), wk);
198
199 /* PIBC8 設定 */
200 wk = sil_reh_mem((void *) PIBC(8));
201 wk &= ~PSW_PORT_MASK;
202 wk |= (PSW_PORT_PIBC_INIT & PSW_PORT_MASK);
203 sil_wrh_mem((void *) PIBC(8), wk);
204
205 /* エッジ検出立ち下がり */
206 sil_wrb_mem((void *)FCLA0CTL4_INTPL, 0x02);
207 sil_wrb_mem((void *)FCLA0CTL5_INTPL, 0x02);
208}
209
210
211/*
212 * PUSHスイッチ状態の読み込み
213 */
214uint8
215switch_push_sense(void){
216 uint16 wk;
217 uint16 mask;
218
219 wk = sil_reh_mem((void *) PPR(8));
220 mask =0;
221 if(!(wk & PSW1_PORT)) {
222 mask |= PSW1;
223 }
224 if(!(wk & PSW2_PORT)) {
225 mask |= PSW2;
226 }
227
228 return(mask);
229}
Note: See TracBrowser for help on using the repository browser.