bac66143a21d14c53f875da34132b7375c49e396
[my-code/arm.git] / betty / betty.c
1 /*
2  * betty.c - alternative firmware for the betty tv ;)
3  *
4  * author: hackbard@hackdaworld.org
5  *
6  */
7
8 /* includes */
9 #include "betty.h"
10
11 /*
12  * global variables
13  */
14
15 const char announce[]="betty - live from flash at 0x80000000! ;)\r\n";
16 const char d1_txt[]="betty";
17 const char d2_txt[]="- alphablend -";
18 u8 contrast;
19 t_button button;
20
21 /*
22  * functions
23  */
24
25 #define cc1100_init     spi1_init(8,SPI_MASTER,8)
26
27 void display_string_page(u8 x,u8 p,u8 *s,u8 f,u8 o,u8 sp) {
28
29         while(*(s)) {
30                 if(x==DISPLAY_DIMX) {
31                         p+=1;
32                         x=o;
33                 }
34                 display_font_page(x,p,(u8 *)default_font+(*(s)<<3),f);
35                 x+=sp;
36                 s++;
37         }
38 }
39
40 void __attribute__ ((interrupt("IRQ"))) input_event(void) {
41
42         u8 noret,tries;
43
44         /* button scan */
45         if(button_get_event(&button)) {
46                 switch(button.key[0]) {
47                         case BUTTON_POWER:
48                                 display_logo((u8 *)default_logo);
49                                 break;
50                         case BUTTON_DOWN:
51                                 if(contrast>0x00)
52                                         contrast-=1;
53                                 DISPLAY_SET_CONTRAST(contrast);
54                                 break;
55                         case BUTTON_UP:
56                                 if(contrast<0x3f)
57                                         contrast+=1;
58                                 DISPLAY_SET_CONTRAST(contrast);
59                                 break;
60                         case BUTTON_A:
61                                 display_fill_screen(DISPLAY_FILL_W);
62                                 break;
63                         case BUTTON_B:
64                                 display_fill_screen(DISPLAY_FILL_LG);
65                                 break;
66                         case BUTTON_C:
67                                 display_fill_screen(DISPLAY_FILL_DG);
68                                 break;
69                         case BUTTON_D:
70                                 display_fill_screen(DISPLAY_FILL_B);
71                                 break;
72                         case BUTTON_1:
73                                 display_rectangle_page(4,2,60,5,
74                                                        DISPLAY_FILL_B,0xff);
75                                 break;
76                         case BUTTON_2:
77                                 display_rectangle_page(40,5,50,5,
78                                                        DISPLAY_FILL_LG,0x7f);
79                                 break;
80                         case BUTTON_3:
81                                 break;
82                         case BUTTON_4:
83                                 display_font_page(42,18,
84                                                   (u8 *)default_font+(0x34<<3),
85                                                   DISPLAY_FILL_B);
86                                 break;
87                         case BUTTON_5:
88                                 display_font_page(50,18,
89                                                   (u8 *)default_font+(0x35<<3),
90                                                   DISPLAY_FILL_DG);
91                                 break;
92                         case BUTTON_6:
93                                 display_font_page(58,18,
94                                                   (u8 *)default_font+(0x36<<3),
95                                                   DISPLAY_FILL_W);
96                                 break;
97                         case BUTTON_7:
98                                 break;
99                         case BUTTON_8:
100                                 break;
101                         case BUTTON_BETTY:
102                                 display_string_page(50,13,(u8 *)d1_txt,
103                                                     DISPLAY_FILL_B,0,8);
104                                 break;
105                         case BUTTON_EXIT:
106                                 display_string_page(10,8,(u8 *)d2_txt,
107                                                     DISPLAY_FILL_B,0,8);
108                                 break;
109                         default:
110                                 display_clear_screen();
111                                 break;
112                 }
113         }
114
115         /* resume the interrupt at button release */
116         noret=1;
117         while(noret) {
118                 tries=0xff;
119                 noret=1;
120                 while(tries--) {
121                         noret=IOPIN0&(1<<30)?0:1;
122                         if(noret)
123                                 break;
124                 }
125         }
126         interrupt_ack();
127         interrupt_ext_ir_set(INTERRUPT_EXT3);
128 }
129
130 /*
131  * main function
132  */
133
134 int main() {
135
136         /* variables */
137
138         /* system init */
139         pll_init();
140         pin_init();
141         ext_mem_init();
142
143         /* memory mapping - dirty! */
144         if((void *)announce<(void *)FLASH_BANK0)
145                 mmap_init(MEMTYPE_RAM);
146         else
147                 mmap_init(MEMTYPE_EXT);
148         
149         /* uart init */
150         uart0_init();
151
152         /* display init */
153         display_bl_init();
154
155         /* button init */
156         button.mode=BUTTON_INT;
157         button_init(&button);
158         button_set_retries(&button,30);
159
160         /* flash init */
161         flash_init();
162
163         /* display init */
164         display_init();
165         contrast=0x38;
166
167         /* interrupt init */
168         interrupt_init();
169         interrupt_ext_ir_config(INTERRUPT_EXT3,INTERRUPT_EXT_NOWAKE,
170                                 INTERRUPT_EXT_MODE_EDGE,
171                                 INTERRUPT_EXT_POLAR_LOW);
172         interrupt_ext_ir_set(INTERRUPT_EXT3);
173         interrupt_enable(INTERRUPT_EINT3,INTERRUPT_MODE_VIRQ,
174                          0,(u32)input_event);
175
176         /*
177          * start it ...
178          */
179
180         /* toggle the display back light */
181         display_bl_toggle();
182
183         /* announce */
184         uart0_send_string((char *)announce);
185
186         
187         while(1) {
188                 pause(0xffffff);
189                 uart0_send_string((char *)announce);
190         }
191
192         return 0;
193 }