Modularize
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ build/ec.rom: build/ec.ihx | |||||||
|  |  | ||||||
| build/ec.ihx: $(OBJ) | build/ec.ihx: $(OBJ) | ||||||
| 	mkdir -p build | 	mkdir -p build | ||||||
| 	sdcc -mmcs51 -o $@ $< | 	sdcc -mmcs51 -o $@ $^ | ||||||
|  |  | ||||||
| build/%.rel: src/%.c $(INCLUDE) | build/%.rel: src/%.c $(INCLUDE) | ||||||
| 	mkdir -p build | 	mkdir -p build | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								src/delay.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/delay.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | #include <8051.h> | ||||||
|  |  | ||||||
|  | #include "include/delay.h" | ||||||
|  |  | ||||||
|  | void timer_clear(void) { | ||||||
|  |     TR0 = 0; | ||||||
|  |     TF0 = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void timer_mode_1(int value) { | ||||||
|  |     timer_clear(); | ||||||
|  |     TMOD = 0x01; | ||||||
|  |     TH0 = (unsigned char)(value >> 8); | ||||||
|  |     TL0 = (unsigned char)value; | ||||||
|  |     TR0 = 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void delay_ms(int ms) { | ||||||
|  |     for (int i = 0; i < ms; i++) { | ||||||
|  |         // One millisecond in ticks is determined as follows: | ||||||
|  |         //   9.2 MHz is the clock rate | ||||||
|  |         //   The timer divider is 12 | ||||||
|  |         //   The timer rate is 12 / 9.2 MHz = 1.304 us | ||||||
|  |         //   The ticks are 1000 ms / (1.304 us) = 766.667 | ||||||
|  |         //   65536 - 766.667 = 64769.33 | ||||||
|  |         timer_mode_1(64769); | ||||||
|  |         while (TF0 == 0) {} | ||||||
|  |         timer_clear(); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								src/gctrl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/gctrl.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | #include "include/gctrl.h" | ||||||
|  |  | ||||||
|  | void gctrl_init(void) { | ||||||
|  |     SPCTRL1 = 0x03; | ||||||
|  |     BADRSEL = 0; | ||||||
|  |     RSTS = 0x84; | ||||||
|  | } | ||||||
							
								
								
									
										100
									
								
								src/gpio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/gpio.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | #include "include/gpio.h" | ||||||
|  |  | ||||||
|  | void gpio_init() { | ||||||
|  |     // Enable LPC reset on GPD2 | ||||||
|  |     GCR = 0x04; | ||||||
|  |  | ||||||
|  |     // Set GPIO data | ||||||
|  |     GPDRA = 0; | ||||||
|  |     GPDRB = (1 << 0); | ||||||
|  |     GPDRC = 0; | ||||||
|  |     GPDRD = (1 << 5) | (1 << 4) | (1 << 3); | ||||||
|  |     GPDRE = 0; | ||||||
|  |     GPDRF = (1 << 7) | (1 << 6); | ||||||
|  |     GPDRG = 0; | ||||||
|  |     GPDRH = 0; | ||||||
|  |     GPDRI = 0; | ||||||
|  |     GPDRJ = 0; | ||||||
|  |  | ||||||
|  |     // Set GPIO control | ||||||
|  |     GPCRA0 = 0x80; | ||||||
|  |     GPCRA1 = 0x00; | ||||||
|  |     GPCRA2 = 0x00; | ||||||
|  |     GPCRA3 = 0x80; | ||||||
|  |     GPCRA4 = 0x40; | ||||||
|  |     GPCRA5 = 0x44; | ||||||
|  |     GPCRA6 = 0x44; | ||||||
|  |     GPCRA7 = 0x44; | ||||||
|  |     GPCRB0 = 0x44; | ||||||
|  |     GPCRB1 = 0x44; | ||||||
|  |     GPCRB2 = 0x84; | ||||||
|  |     GPCRB3 = 0x00; | ||||||
|  |     GPCRB4 = 0x00; | ||||||
|  |     GPCRB5 = 0x44; | ||||||
|  |     GPCRB6 = 0x84; | ||||||
|  |     GPCRB7 = 0x80; | ||||||
|  |     GPCRC0 = 0x80; | ||||||
|  |     GPCRC1 = 0x84; | ||||||
|  |     GPCRC2 = 0x84; | ||||||
|  |     GPCRC3 = 0x84; | ||||||
|  |     GPCRC4 = 0x44; | ||||||
|  |     GPCRC5 = 0x44; | ||||||
|  |     GPCRC6 = 0x40; | ||||||
|  |     GPCRC7 = 0x44; | ||||||
|  |     GPCRD0 = 0x84; | ||||||
|  |     GPCRD1 = 0x84; | ||||||
|  |     GPCRD2 = 0x00; | ||||||
|  |     GPCRD3 = 0x80; | ||||||
|  |     GPCRD4 = 0x80; | ||||||
|  |     GPCRD5 = 0x44; | ||||||
|  |     GPCRD6 = 0x80; | ||||||
|  |     GPCRD7 = 0x80; | ||||||
|  |     GPCRE0 = 0x44; | ||||||
|  |     GPCRE1 = 0x44; | ||||||
|  |     GPCRE2 = 0x80; | ||||||
|  |     GPCRE3 = 0x40; | ||||||
|  |     GPCRE4 = 0x42; | ||||||
|  |     GPCRE5 = 0x40; | ||||||
|  |     GPCRE6 = 0x44; | ||||||
|  |     GPCRE7 = 0x44; | ||||||
|  |     GPCRF0 = 0x80; | ||||||
|  |     GPCRF1 = 0x44; | ||||||
|  |     GPCRF2 = 0x84; | ||||||
|  |     GPCRF3 = 0x44; | ||||||
|  |     GPCRF4 = 0x80; | ||||||
|  |     GPCRF5 = 0x80; | ||||||
|  |     GPCRF6 = 0x00; | ||||||
|  |     GPCRF7 = 0x80; | ||||||
|  |     GPCRG0 = 0x44; | ||||||
|  |     GPCRG1 = 0x44; | ||||||
|  |     GPCRG2 = 0x40; | ||||||
|  |     GPCRG3 = 0x00; | ||||||
|  |     GPCRG4 = 0x00; | ||||||
|  |     GPCRG5 = 0x00; | ||||||
|  |     GPCRG6 = 0x44; | ||||||
|  |     GPCRG7 = 0x00; | ||||||
|  |     GPCRH0 = 0x00; | ||||||
|  |     GPCRH1 = 0x80; | ||||||
|  |     GPCRH2 = 0x44; | ||||||
|  |     GPCRH3 = 0x44; | ||||||
|  |     GPCRH4 = 0x80; | ||||||
|  |     GPCRH5 = 0x80; | ||||||
|  |     GPCRH6 = 0x80; | ||||||
|  |     GPCRH7 = 0x80; | ||||||
|  |     GPCRI0 = 0x00; | ||||||
|  |     GPCRI1 = 0x00; | ||||||
|  |     GPCRI2 = 0x80; | ||||||
|  |     GPCRI3 = 0x00; | ||||||
|  |     GPCRI4 = 0x00; | ||||||
|  |     GPCRI5 = 0x80; | ||||||
|  |     GPCRI6 = 0x80; | ||||||
|  |     GPCRI7 = 0x80; | ||||||
|  |     GPCRJ0 = 0x82; | ||||||
|  |     GPCRJ1 = 0x80; | ||||||
|  |     GPCRJ2 = 0x40; | ||||||
|  |     GPCRJ3 = 0x80; | ||||||
|  |     GPCRJ4 = 0x44; | ||||||
|  |     GPCRJ5 = 0x40; | ||||||
|  |     GPCRJ6 = 0x44; | ||||||
|  |     GPCRJ7 = 0x80; | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								src/include/delay.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/include/delay.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #ifndef _DELAY_H_ | ||||||
|  | #define _DELAY_H_ | ||||||
|  |  | ||||||
|  | void delay_ms(int ms); | ||||||
|  |  | ||||||
|  | #endif // _DELAY_H_ | ||||||
| @@ -1,6 +1,8 @@ | |||||||
| #ifndef _GCTRL_H_ | #ifndef _GCTRL_H_ | ||||||
| #define _GCTRL_H_ | #define _GCTRL_H_ | ||||||
|  |  | ||||||
|  | void gctrl_init(void); | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x2006) RSTS; | __xdata volatile unsigned char __at(0x2006) RSTS; | ||||||
| __xdata volatile unsigned char __at(0x200A) BADRSEL; | __xdata volatile unsigned char __at(0x200A) BADRSEL; | ||||||
| __xdata volatile unsigned char __at(0x200D) SPCTRL1; | __xdata volatile unsigned char __at(0x200D) SPCTRL1; | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| #ifndef _GPIO_H_ | #ifndef _GPIO_H_ | ||||||
| #define _GPIO_H_ | #define _GPIO_H_ | ||||||
|  |  | ||||||
|  | void gpio_init(void); | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x1600) GCR; | __xdata volatile unsigned char __at(0x1600) GCR; | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x1601) GPDRA; | __xdata volatile unsigned char __at(0x1601) GPDRA; | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| #ifndef _KBC_H_ | #ifndef _KBC_H_ | ||||||
| #define _KBC_H_ | #define _KBC_H_ | ||||||
|  |  | ||||||
|  | void kbc_init(void); | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x1300) KBHICR; | __xdata volatile unsigned char __at(0x1300) KBHICR; | ||||||
| __xdata volatile unsigned char __at(0x1302) KBIRQR; | __xdata volatile unsigned char __at(0x1302) KBIRQR; | ||||||
| __xdata volatile unsigned char __at(0x1304) KBHISR; | __xdata volatile unsigned char __at(0x1304) KBHISR; | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| #ifndef _KBSCAN_H_ | #ifndef _KBSCAN_H_ | ||||||
| #define _KBSCAN_H_ | #define _KBSCAN_H_ | ||||||
|  |  | ||||||
|  | void kbscan_init(void); | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x1D00) KSOL; | __xdata volatile unsigned char __at(0x1D00) KSOL; | ||||||
| __xdata volatile unsigned char __at(0x1D01) KSOH1; | __xdata volatile unsigned char __at(0x1D01) KSOH1; | ||||||
| __xdata volatile unsigned char __at(0x1D02) KSOCTRL; | __xdata volatile unsigned char __at(0x1D02) KSOCTRL; | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								src/include/pin.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/include/pin.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | #ifndef _PIN_H_ | ||||||
|  | #define _PIN_H_ | ||||||
|  |  | ||||||
|  | #include <stdbool.h> | ||||||
|  |  | ||||||
|  | #include "gpio.h" | ||||||
|  |  | ||||||
|  | struct Pin { | ||||||
|  |     __xdata volatile unsigned char * data; | ||||||
|  |     __xdata volatile unsigned char * mirror; | ||||||
|  |     __xdata volatile unsigned char * control; | ||||||
|  |     unsigned char value; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #define PIN(BLOCK, NUMBER) { \ | ||||||
|  |     .data = &GPDR ## BLOCK, \ | ||||||
|  |     .mirror = &GPDMR ## BLOCK, \ | ||||||
|  |     .control = &GPCR ## BLOCK ## NUMBER, \ | ||||||
|  |     .value = (1 << NUMBER), \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool pin_get(struct Pin * pin); | ||||||
|  | void pin_set(struct Pin * pin, bool value); | ||||||
|  |  | ||||||
|  | #endif // _PIN_H_ | ||||||
| @@ -1,6 +1,8 @@ | |||||||
| #ifndef _PMC_H_ | #ifndef _PMC_H_ | ||||||
| #define _PMC_H_ | #define _PMC_H_ | ||||||
|  |  | ||||||
|  | void pmc_init(void); | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x1506) PM1CTL; | __xdata volatile unsigned char __at(0x1506) PM1CTL; | ||||||
| __xdata volatile unsigned char __at(0x1516) PM2CTL; | __xdata volatile unsigned char __at(0x1516) PM2CTL; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| #ifndef _PS2_H_ | #ifndef _PS2_H_ | ||||||
| #define _PS2_H_ | #define _PS2_H_ | ||||||
|  |  | ||||||
|  | void ps2_init(void); | ||||||
|  |  | ||||||
| __xdata volatile unsigned char __at(0x1700) PSCTL1; | __xdata volatile unsigned char __at(0x1700) PSCTL1; | ||||||
| __xdata volatile unsigned char __at(0x1701) PSCTL2; | __xdata volatile unsigned char __at(0x1701) PSCTL2; | ||||||
| __xdata volatile unsigned char __at(0x1702) PSCTL3; | __xdata volatile unsigned char __at(0x1702) PSCTL3; | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								src/include/reset.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/include/reset.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #ifndef _RESET_H_ | ||||||
|  | #define _RESET_H_ | ||||||
|  |  | ||||||
|  | void reset(void); | ||||||
|  |  | ||||||
|  | #endif // _RESET_H_ | ||||||
							
								
								
									
										6
									
								
								src/kbc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/kbc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #include "include/kbc.h" | ||||||
|  |  | ||||||
|  | void kbc_init(void) { | ||||||
|  |     KBIRQR = 0; | ||||||
|  |     KBHICR = 0x48; | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								src/kbscan.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/kbscan.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | #include "include/kbscan.h" | ||||||
|  |  | ||||||
|  | void kbscan_init(void) { | ||||||
|  |     KSOCTRL = 0x05; | ||||||
|  |     KSICTRLR = 0x04; | ||||||
|  |  | ||||||
|  |     // Set all outputs to GPIO mode and high | ||||||
|  |     KSOH2 = 0xFF; | ||||||
|  |     KSOH1 = 0xFF; | ||||||
|  |     KSOL = 0xFF; | ||||||
|  |     KSOHGCTRL = 0xFF; | ||||||
|  |     KSOHGOEN = 0xFF; | ||||||
|  |     KSOLGCTRL = 0xFF; | ||||||
|  |     KSOLGOEN = 0xFF; | ||||||
|  | } | ||||||
							
								
								
									
										256
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										256
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -1,219 +1,15 @@ | |||||||
| #include "include/signature.h" |  | ||||||
|  |  | ||||||
| void reset() { |  | ||||||
|     __asm__("ljmp 0"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include "include/gpio.h" |  | ||||||
|  |  | ||||||
| void gpio_init() { |  | ||||||
|     // Enable LPC reset on GPD2 |  | ||||||
|     GCR = 0x04; |  | ||||||
|  |  | ||||||
|     // Set GPIO data |  | ||||||
|     GPDRA = 0; |  | ||||||
|     GPDRB = (1 << 0); |  | ||||||
|     GPDRC = 0; |  | ||||||
|     GPDRD = (1 << 5) | (1 << 4) | (1 << 3); |  | ||||||
|     GPDRE = 0; |  | ||||||
|     GPDRF = (1 << 7) | (1 << 6); |  | ||||||
|     GPDRG = 0; |  | ||||||
|     GPDRH = 0; |  | ||||||
|     GPDRI = 0; |  | ||||||
|     GPDRJ = 0; |  | ||||||
|  |  | ||||||
|     // Set GPIO control |  | ||||||
|     GPCRA0 = 0x80; |  | ||||||
|     GPCRA1 = 0x00; |  | ||||||
|     GPCRA2 = 0x00; |  | ||||||
|     GPCRA3 = 0x80; |  | ||||||
|     GPCRA4 = 0x40; |  | ||||||
|     GPCRA5 = 0x44; |  | ||||||
|     GPCRA6 = 0x44; |  | ||||||
|     GPCRA7 = 0x44; |  | ||||||
|     GPCRB0 = 0x44; |  | ||||||
|     GPCRB1 = 0x44; |  | ||||||
|     GPCRB2 = 0x84; |  | ||||||
|     GPCRB3 = 0x00; |  | ||||||
|     GPCRB4 = 0x00; |  | ||||||
|     GPCRB5 = 0x44; |  | ||||||
|     GPCRB6 = 0x84; |  | ||||||
|     GPCRB7 = 0x80; |  | ||||||
|     GPCRC0 = 0x80; |  | ||||||
|     GPCRC1 = 0x84; |  | ||||||
|     GPCRC2 = 0x84; |  | ||||||
|     GPCRC3 = 0x84; |  | ||||||
|     GPCRC4 = 0x44; |  | ||||||
|     GPCRC5 = 0x44; |  | ||||||
|     GPCRC6 = 0x40; |  | ||||||
|     GPCRC7 = 0x44; |  | ||||||
|     GPCRD0 = 0x84; |  | ||||||
|     GPCRD1 = 0x84; |  | ||||||
|     GPCRD2 = 0x00; |  | ||||||
|     GPCRD3 = 0x80; |  | ||||||
|     GPCRD4 = 0x80; |  | ||||||
|     GPCRD5 = 0x44; |  | ||||||
|     GPCRD6 = 0x80; |  | ||||||
|     GPCRD7 = 0x80; |  | ||||||
|     GPCRE0 = 0x44; |  | ||||||
|     GPCRE1 = 0x44; |  | ||||||
|     GPCRE2 = 0x80; |  | ||||||
|     GPCRE3 = 0x40; |  | ||||||
|     GPCRE4 = 0x42; |  | ||||||
|     GPCRE5 = 0x40; |  | ||||||
|     GPCRE6 = 0x44; |  | ||||||
|     GPCRE7 = 0x44; |  | ||||||
|     GPCRF0 = 0x80; |  | ||||||
|     GPCRF1 = 0x44; |  | ||||||
|     GPCRF2 = 0x84; |  | ||||||
|     GPCRF3 = 0x44; |  | ||||||
|     GPCRF4 = 0x80; |  | ||||||
|     GPCRF5 = 0x80; |  | ||||||
|     GPCRF6 = 0x00; |  | ||||||
|     GPCRF7 = 0x80; |  | ||||||
|     GPCRG0 = 0x44; |  | ||||||
|     GPCRG1 = 0x44; |  | ||||||
|     GPCRG2 = 0x40; |  | ||||||
|     GPCRG3 = 0x00; |  | ||||||
|     GPCRG4 = 0x00; |  | ||||||
|     GPCRG5 = 0x00; |  | ||||||
|     GPCRG6 = 0x44; |  | ||||||
|     GPCRG7 = 0x00; |  | ||||||
|     GPCRH0 = 0x00; |  | ||||||
|     GPCRH1 = 0x80; |  | ||||||
|     GPCRH2 = 0x44; |  | ||||||
|     GPCRH3 = 0x44; |  | ||||||
|     GPCRH4 = 0x80; |  | ||||||
|     GPCRH5 = 0x80; |  | ||||||
|     GPCRH6 = 0x80; |  | ||||||
|     GPCRH7 = 0x80; |  | ||||||
|     GPCRI0 = 0x00; |  | ||||||
|     GPCRI1 = 0x00; |  | ||||||
|     GPCRI2 = 0x80; |  | ||||||
|     GPCRI3 = 0x00; |  | ||||||
|     GPCRI4 = 0x00; |  | ||||||
|     GPCRI5 = 0x80; |  | ||||||
|     GPCRI6 = 0x80; |  | ||||||
|     GPCRI7 = 0x80; |  | ||||||
|     GPCRJ0 = 0x82; |  | ||||||
|     GPCRJ1 = 0x80; |  | ||||||
|     GPCRJ2 = 0x40; |  | ||||||
|     GPCRJ3 = 0x80; |  | ||||||
|     GPCRJ4 = 0x44; |  | ||||||
|     GPCRJ5 = 0x40; |  | ||||||
|     GPCRJ6 = 0x44; |  | ||||||
|     GPCRJ7 = 0x80; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include "include/gctrl.h" |  | ||||||
|  |  | ||||||
| void gctrl_init() { |  | ||||||
|     SPCTRL1 = 0x03; |  | ||||||
|     BADRSEL = 0; |  | ||||||
|     RSTS = 0x84; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include "include/kbc.h" |  | ||||||
|  |  | ||||||
| void kbc_init() { |  | ||||||
|     KBIRQR = 0; |  | ||||||
|     KBHICR = 0x48; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include "include/pmc.h" |  | ||||||
|  |  | ||||||
| void pmc_init() { |  | ||||||
|     PM1CTL = 0x41; |  | ||||||
|     PM2CTL = 0x41; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include "include/ps2.h" |  | ||||||
|  |  | ||||||
| void ps2_init() { |  | ||||||
|     PSCTL1 = 0x11; |  | ||||||
|     PSCTL2 = 0x41; |  | ||||||
|     PSCTL3 = 0x41; |  | ||||||
|     PSINT1 = 0x04; |  | ||||||
|     PSINT2 = 0x04; |  | ||||||
|     PSINT3 = 0x04; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include "include/kbscan.h" |  | ||||||
|  |  | ||||||
| void kbscan_init() { |  | ||||||
|     KSOCTRL = 0x05; |  | ||||||
|     KSICTRLR = 0x04; |  | ||||||
|  |  | ||||||
|     // Set all outputs to GPIO mode and high |  | ||||||
|     KSOH2 = 0xFF; |  | ||||||
|     KSOH1 = 0xFF; |  | ||||||
|     KSOL = 0xFF; |  | ||||||
|     KSOHGCTRL = 0xFF; |  | ||||||
|     KSOHGOEN = 0xFF; |  | ||||||
|     KSOLGCTRL = 0xFF; |  | ||||||
|     KSOLGOEN = 0xFF; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include <8051.h> | #include <8051.h> | ||||||
|  |  | ||||||
| void timer_clear(void) { |  | ||||||
|     TR0 = 0; |  | ||||||
|     TF0 = 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void timer_mode_1(int value) { |  | ||||||
|     timer_clear(); |  | ||||||
|     TMOD = 0x01; |  | ||||||
|     TH0 = (unsigned char)(value >> 8); |  | ||||||
|     TL0 = (unsigned char)value; |  | ||||||
|     TR0 = 1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void delay_ms(int ms) { |  | ||||||
|     for (int i = 0; i < ms; i++) { |  | ||||||
|         // One millisecond in ticks is determined as follows: |  | ||||||
|         //   9.2 MHz is the clock rate |  | ||||||
|         //   The timer divider is 12 |  | ||||||
|         //   The timer rate is 12 / 9.2 MHz = 1.304 us |  | ||||||
|         //   The ticks are 1000 ms / (1.304 us) = 766.667 |  | ||||||
|         //   65536 - 766.667 = 64769.33 |  | ||||||
|         timer_mode_1(64769); |  | ||||||
|         while (TF0 == 0) {} |  | ||||||
|         timer_clear(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
| struct Pin { | #include "include/delay.h" | ||||||
|     __xdata volatile unsigned char * data; | #include "include/gpio.h" | ||||||
|     __xdata volatile unsigned char * mirror; | #include "include/gctrl.h" | ||||||
|     __xdata volatile unsigned char * control; | #include "include/kbc.h" | ||||||
|     unsigned char value; | #include "include/pin.h" | ||||||
| }; | #include "include/pmc.h" | ||||||
|  | #include "include/ps2.h" | ||||||
| #define PIN(BLOCK, NUMBER) { \ | #include "include/kbscan.h" | ||||||
|     .data = &GPDR ## BLOCK, \ |  | ||||||
|     .mirror = &GPDMR ## BLOCK, \ |  | ||||||
|     .control = &GPCR ## BLOCK ## NUMBER, \ |  | ||||||
|     .value = (1 << NUMBER), \ |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool pin_get(struct Pin * pin) { |  | ||||||
|     if (*(pin->data) & pin->value) { |  | ||||||
|         return true; |  | ||||||
|     } else { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void pin_set(struct Pin * pin, bool value) { |  | ||||||
|     if (value) { |  | ||||||
|         *(pin->data) |= pin->value; |  | ||||||
|     } else { |  | ||||||
|         *(pin->data) &= ~(pin->value); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| struct Pin LED_BAT_CHG = PIN(A, 5); | struct Pin LED_BAT_CHG = PIN(A, 5); | ||||||
| struct Pin LED_BAT_FULL = PIN(A, 6); | struct Pin LED_BAT_FULL = PIN(A, 6); | ||||||
| @@ -223,41 +19,11 @@ struct Pin LED_AIRPLANE_N = PIN(G, 6); | |||||||
|  |  | ||||||
| struct Pin PWR_SW = PIN(D, 0); | struct Pin PWR_SW = PIN(D, 0); | ||||||
|  |  | ||||||
| void parallel_write(unsigned char value) { |  | ||||||
|     // Make sure clock is high |  | ||||||
|     KSOH1 = 0xFF; |  | ||||||
|     delay_ms(1); |  | ||||||
|  |  | ||||||
|     // Set value |  | ||||||
|     KSOL = value; |  | ||||||
|     delay_ms(1); |  | ||||||
|  |  | ||||||
|     // Set clock low |  | ||||||
|     KSOH1 = 0; |  | ||||||
|     pin_set(&LED_ACIN, true); |  | ||||||
|     delay_ms(1); |  | ||||||
|  |  | ||||||
|     // Set clock high again |  | ||||||
|     pin_set(&LED_ACIN, false); |  | ||||||
|     KSOH1 = 0xFF; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void puts(const char * s) { |  | ||||||
|     char c; |  | ||||||
|     while (c = *(s++)) { |  | ||||||
|         parallel_write((unsigned char)c); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void main() { | void main() { | ||||||
|     gpio_init(); |     gpio_init(); | ||||||
|  |  | ||||||
|     gctrl_init(); |     gctrl_init(); | ||||||
|  |  | ||||||
|     kbc_init(); |     kbc_init(); | ||||||
|  |  | ||||||
|     pmc_init(); |     pmc_init(); | ||||||
|  |  | ||||||
|     kbscan_init(); |     kbscan_init(); | ||||||
|  |  | ||||||
|     //TODO: INTC, PECI, PWM, SMBUS |     //TODO: INTC, PECI, PWM, SMBUS | ||||||
| @@ -266,14 +32,14 @@ void main() { | |||||||
|     pin_set(&LED_BAT_CHG, true); |     pin_set(&LED_BAT_CHG, true); | ||||||
|     delay_ms(1000); |     delay_ms(1000); | ||||||
|     pin_set(&LED_BAT_FULL, true); |     pin_set(&LED_BAT_FULL, true); | ||||||
|     puts("Hello from System76 EC!\n"); |     printf("Hello from System76 EC!\n"); | ||||||
|  |  | ||||||
|     bool last = false; |     bool last = false; | ||||||
|     for(;;) { |     for(;;) { | ||||||
|         // Check if the power switch goes low |         // Check if the power switch goes low | ||||||
|         bool new = pin_get(&PWR_SW); |         bool new = pin_get(&PWR_SW); | ||||||
|         if (!new && last) { |         if (!new && last) { | ||||||
|             puts("Power Switch\n"); |             printf("Power Switch\n"); | ||||||
|         } |         } | ||||||
|         last = new; |         last = new; | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								src/pin.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/pin.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | #include "include/pin.h" | ||||||
|  |  | ||||||
|  | bool pin_get(struct Pin * pin) { | ||||||
|  |     if (*(pin->data) & pin->value) { | ||||||
|  |         return true; | ||||||
|  |     } else { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void pin_set(struct Pin * pin, bool value) { | ||||||
|  |     if (value) { | ||||||
|  |         *(pin->data) |= pin->value; | ||||||
|  |     } else { | ||||||
|  |         *(pin->data) &= ~(pin->value); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								src/pmc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/pmc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #include "include/pmc.h" | ||||||
|  |  | ||||||
|  | void pmc_init(void) { | ||||||
|  |     PM1CTL = 0x41; | ||||||
|  |     PM2CTL = 0x41; | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								src/ps2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/ps2.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | #include "include/ps2.h" | ||||||
|  |  | ||||||
|  | void ps2_init(void) { | ||||||
|  |     PSCTL1 = 0x11; | ||||||
|  |     PSCTL2 = 0x41; | ||||||
|  |     PSCTL3 = 0x41; | ||||||
|  |     PSINT1 = 0x04; | ||||||
|  |     PSINT2 = 0x04; | ||||||
|  |     PSINT3 = 0x04; | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								src/reset.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/reset.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | #include "include/reset.h" | ||||||
|  |  | ||||||
|  | void reset(void) { | ||||||
|  |     __asm__("ljmp 0"); | ||||||
|  | } | ||||||
| @@ -1,6 +1,3 @@ | |||||||
| #ifndef _SIGNATURE_H_ |  | ||||||
| #define _SIGNATURE_H_ |  | ||||||
| 
 |  | ||||||
| static __code char __at(0x40) SIGNATURE[32] = { | static __code char __at(0x40) SIGNATURE[32] = { | ||||||
|     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x94, |     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x94, | ||||||
|     0x85, 0x12, 0x5A, 0x5A, 0xAA, 0x00, 0x55, 0x55, |     0x85, 0x12, 0x5A, 0x5A, 0xAA, 0x00, 0x55, 0x55, | ||||||
| @@ -8,5 +5,3 @@ static __code char __at(0x40) SIGNATURE[32] = { | |||||||
|     0x49, 0x54, 0x45, 0x20, 0x54, 0x65, 0x63, 0x68, |     0x49, 0x54, 0x45, 0x20, 0x54, 0x65, 0x63, 0x68, | ||||||
|     0x2E, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x20 |     0x2E, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x20 | ||||||
| }; | }; | ||||||
| 
 |  | ||||||
| #endif // _SIGNATURE_H_
 |  | ||||||
							
								
								
									
										27
									
								
								src/stdio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/stdio.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | #include "include/delay.h" | ||||||
|  | #include "include/kbscan.h" | ||||||
|  |  | ||||||
|  | void parallel_write(unsigned char value) { | ||||||
|  |     // Make sure clock is high | ||||||
|  |     KSOH1 = 0xFF; | ||||||
|  |     delay_ms(1); | ||||||
|  |  | ||||||
|  |     // Set value | ||||||
|  |     KSOL = value; | ||||||
|  |     delay_ms(1); | ||||||
|  |  | ||||||
|  |     // Set clock low | ||||||
|  |     KSOH1 = 0; | ||||||
|  |     delay_ms(1); | ||||||
|  |  | ||||||
|  |     // Set clock high again | ||||||
|  |     KSOH1 = 0xFF; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int putchar(int c) { | ||||||
|  |     unsigned char byte = (unsigned char)c; | ||||||
|  |     parallel_write(byte); | ||||||
|  |     return (int)byte; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user