summaryrefslogtreecommitdiff
path: root/firmware/system.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-01-12 00:35:50 +0000
committerDave Chapman <dave@dchapman.com>2006-01-12 00:35:50 +0000
commitd83e929f3fc369a5981e1e40e1c5307169a46cfc (patch)
treeac323ca5811374a030a1b65bb77fc7ccc163db04 /firmware/system.c
parent8d130684214d23a9163810d1dacc33d108f2338a (diff)
downloadrockbox-d83e929f3fc369a5981e1e40e1c5307169a46cfc.tar.gz
rockbox-d83e929f3fc369a5981e1e40e1c5307169a46cfc.zip
Work-in-progress iriver iFP-7xx port by Tomasz Malesinski
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8342 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/system.c')
-rw-r--r--firmware/system.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/firmware/system.c b/firmware/system.c
index 7afa3f720e..da15ee1122 100644
--- a/firmware/system.c
+++ b/firmware/system.c
@@ -1191,5 +1191,86 @@ int system_memory_guard(int newmode)
1191 return 0; 1191 return 0;
1192} 1192}
1193 1193
1194#elif CONFIG_CPU==PNX0101
1195
1196interrupt_handler_t interrupt_vector[0x1d] __attribute__ ((section(".idata")));
1197
1198#define IRQ_REG(reg) (*(volatile unsigned long *)(0x80300000 + (reg)))
1199
1200static inline unsigned long irq_read(int reg)
1201{
1202 unsigned long v, v2;
1203 do
1204 {
1205 v = IRQ_REG(reg);
1206 v2 = IRQ_REG(reg);
1207 } while (v != v2);
1208 return v;
1209}
1210
1211#define IRQ_WRITE_WAIT(reg, val, cond) \
1212 do { unsigned long v, v2; \
1213 do { \
1214 IRQ_REG(reg) = (val); \
1215 v = IRQ_REG(reg); \
1216 v2 = IRQ_REG(reg); \
1217 } while ((v != v2) || !(cond)); \
1218 } while (0);
1219
1220static void UIE(void) {}
1221
1222void irq(void)
1223{
1224 int n = irq_read(0x100) >> 3;
1225 (*(interrupt_vector[n]))();
1226}
1227
1228void irq_enable_int(int n)
1229{
1230 IRQ_WRITE_WAIT(0x404 + n * 4, 0x4010000, v & 0x10000);
1231}
1232
1233void irq_set_int_handler(int n, interrupt_handler_t handler)
1234{
1235 interrupt_vector[n + 1] = handler;
1236}
1237
1238void system_init(void)
1239{
1240 int i;
1241
1242 /* turn off watchdog */
1243 (*(volatile unsigned long *)0x80002804) = 0;
1244
1245 /*
1246 IRQ_WRITE_WAIT(0x100, 0, v == 0);
1247 IRQ_WRITE_WAIT(0x104, 0, v == 0);
1248 IRQ_WRITE_WAIT(0, 0, v == 0);
1249 IRQ_WRITE_WAIT(4, 0, v == 0);
1250 */
1251
1252 for (i = 0; i < 0x1c; i++)
1253 {
1254 IRQ_WRITE_WAIT(0x404 + i * 4, 0x1e000001, (v & 0x3010f) == 1);
1255 IRQ_WRITE_WAIT(0x404 + i * 4, 0x4000000, (v & 0x10000) == 0);
1256 IRQ_WRITE_WAIT(0x404 + i * 4, 0x10000001, (v & 0xf) == 1);
1257 interrupt_vector[i + 1] = UIE;
1258 }
1259 interrupt_vector[0] = UIE;
1260}
1261
1262
1263void system_reboot(void)
1264{
1265 (*(volatile unsigned long *)0x80002804) = 1;
1266 while (1);
1267}
1268
1269int system_memory_guard(int newmode)
1270{
1271 (void)newmode;
1272 return 0;
1273}
1274
1194#endif /* CONFIG_CPU */ 1275#endif /* CONFIG_CPU */
1195 1276