Correct added language file: add to sources and set keywords
[maemo-rb.git] / bootloader / telechips.c
blobdcb0c48d6c9a377d131839efe11668b3f88aef78
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2007 by Dave Chapman
12 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
14 * All files in this archive are subject to the GNU General Public License.
15 * See the file COPYING in the source tree root for full license agreement.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #include "config.h"
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include "cpu.h"
27 #include "system.h"
28 #include "lcd.h"
29 #include "kernel.h"
30 #include "thread.h"
31 #include "ata.h"
32 #include "fat.h"
33 #include "disk.h"
34 #include "font.h"
35 #include "button.h"
36 #include "adc.h"
37 #include "adc-target.h"
38 #include "backlight-target.h"
39 #include "panic.h"
40 #include "power.h"
41 #include "file.h"
42 #include "common.h"
44 #if defined(COWON_D2)
45 #include "i2c.h"
46 #endif
48 char version[] = APPSVERSION;
50 extern int line;
52 void* main(void)
54 int button;
55 int power_count = 0;
56 int count = 0;
57 bool do_power_off = false;
59 #if defined(COWON_D2)
60 int i,rc,fd,len;
61 int* buf = (int*)0x21000000; /* Unused DRAM */
62 #endif
64 power_init();
65 system_init();
66 lcd_init();
68 #if defined(COWON_D2)
69 kernel_init();
70 #endif
72 adc_init();
73 button_init();
74 backlight_init();
76 font_init();
77 lcd_setfont(FONT_SYSFIXED);
79 _backlight_on();
81 #if defined(COWON_D2)
82 printf("ATA");
83 rc = ata_init();
84 if(rc)
86 reset_screen();
87 error(EATA, rc);
90 printf("mount");
91 rc = disk_mount_all();
92 if (rc<=0)
94 error(EDISK,rc);
97 #if 0
98 printf("opening test file...");
100 fd = open("/test.bin", O_RDONLY);
101 if (fd < 0) panicf("could not open test file");
103 len = filesize(fd);
104 printf("Length: %x", len);
106 lseek(fd, 0, SEEK_SET);
107 read(fd, buf, len);
108 close(fd);
110 printf("testing contents...");
112 i = 0;
113 while (buf[i] == i && i<(len/4)) { i++; }
115 if (i < len/4)
117 printf("mismatch at %x [0x%x]", i, buf[i]);
119 else
121 printf("passed!");
123 while (!button_read_device()) {};
124 while (button_read_device()) {};
125 #endif
126 #endif
128 while(!do_power_off) {
129 line = 0;
130 printf("Hello World!");
132 button = button_read_device();
134 /* Power-off if POWER button has been held for a long time
135 This loop is currently running at about 100 iterations/second
137 if (button & POWEROFF_BUTTON) {
138 power_count++;
139 if (power_count > 200)
140 do_power_off = true;
141 } else {
142 power_count = 0;
145 printf("Btn: 0x%08x",button);
147 #if defined(COWON_D2)
148 printf("GPIOA: 0x%08x",GPIOA);
149 printf("GPIOB: 0x%08x",GPIOB);
150 printf("GPIOC: 0x%08x",GPIOC);
151 printf("GPIOD: 0x%08x",GPIOD);
152 printf("GPIOE: 0x%08x",GPIOE);
154 for (i = 0; i<4; i++)
156 printf("ADC%d: 0x%04x",i,adc_read(i));
159 /* TODO: Move this stuff out to a touchscreen driver and establish
160 how such a beast is going to work. Since it needs I2C read/write,
161 it can't easily go on an interrupt-based tick task. */
163 unsigned char buf[] = { 0x2f, (0xE<<1) | 1, /* ADC start for X+Y */
164 0, 0, 0 };
165 int x,y;
166 i2c_write(0x10, buf, 2);
167 i2c_readmem(0x10, 0x2e, buf, 5);
168 x = (buf[2] << 2) | (buf[3] & 3);
169 y = (buf[4] << 2) | ((buf[3] & 0xC) >> 2);
170 printf("X: 0x%03x Y: 0x%03x",x,y);
172 x = (x*LCD_WIDTH) / 1024;
173 y = (y*LCD_HEIGHT) / 1024;
174 lcd_hline(x-5, x+5, y);
175 lcd_vline(x, y-5, y+5);
177 buf[0] = 0x2f;
178 buf[1] = (0xF<<1) | 1; /* ADC start for P1+P2 */
179 i2c_write(0x10, buf, 2);
180 i2c_readmem(0x10, 0x2e, buf, 5);
181 x = (buf[2] << 2) | (buf[3] & 3);
182 y = (buf[4] << 2) | ((buf[3] & 0xC) >> 2);
183 printf("P1: 0x%03x P2: 0x%03x",x,y);
185 #endif
187 count++;
188 printf("Count: %d",count);
191 lcd_clear_display();
192 line = 0;
193 printf("POWER-OFF");
195 /* Power-off */
196 power_off();
198 return 0;
201 /* These functions are present in the firmware library, but we reimplement
202 them here because the originals do a lot more than we want */
203 void usb_acknowledge(void)
207 void usb_wait_for_disconnect(void)