Subversion Repositories freemyipod

Rev

Rev 413 | Rev 677 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
163 theseven 1
@
2
@
3
@    emBIOS Loader for iPod Nano 2G
4
@
5
@    Copyright 2010 TheSeven
6
@
7
@
8
@    This file is part of emBIOS.
9
@
10
@    emBIOS is free software: you can redistribute it and/or
11
@    modify it under the terms of the GNU General Public License as
12
@    published by the Free Software Foundation, either version 2 of the
13
@    License, or (at your option) any later version.
14
@
15
@    emBIOS is distributed in the hope that it will be useful,
16
@    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
@    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
@    See the GNU General Public License for more details.
19
@
20
@    You should have received a copy of the GNU General Public License along
21
@    with emBIOS.  If not, see <http://www.gnu.org/licenses/>.
22
@
23
@
24
 
25
.global _start
26
_start:
27
 
28
	msr	cpsr_c, #0xd3
29
	mrc	p15, 0, r0,c1,c0
30
	bic	r0, r0, #1
31
	mcr	p15, 0, r0,c1,c0
32
	mov	r0, #0
33
	mcr	p15, 0, r0,c7,c5
34
	adr	lr, cacheflush_done
35
 
36
flushcache:
37
	mov	r0, #0
38
flushcache_loop:
39
	mcr	p15, 0, r0,c7,c14,2
40
	add	r10, r0, #0x10
41
	mcr	p15, 0, r10,c7,c14,2
42
	add	r10, r10, #0x10
43
	mcr	p15, 0, r10,c7,c14,2
44
	add	r10, r10, #0x10
45
	mcr	p15, 0, r10,c7,c14,2
46
	adds	r0, r0, #0x04000000
47
	bne	flushcache_loop
48
	mcr	p15, 0, r0,c7,c10,4
49
	mov	pc, lr
50
 
51
cacheflush_done:
52
	adr	r0, _start
196 theseven 53
	adr	r1, _stubend + 4
163 theseven 54
	mov	r2, #0x22000000
55
copyloop:
56
	cmp	r1, r0
57
	ldrhi	r3, [r0], #4
58
	strhi	r3, [r2], #4
59
	bhi	copyloop
60
	str	r1, [r2]
61
	mov	r0, #0x22000000
62
	add	pc, r0, #sramstart - _start
63
sramstart:
64
 
65
	adr	lr, values1
66
	ldmia	lr!, {r0-r13}
67
	str	r1, [r0,#0x88]
68
	str	r2, [r0,#0xf0]
69
	str	r4, [r3,#0x38]
70
	mov	r1, #0
71
	str	r7, [r0]
72
	str	r1, [r0,#0x04]
73
	str	r8, [r0,#0x10]
74
	str	r1, [r0,#0x14]
75
	str	r9, [r0,#0x20]
76
	str	r1, [r0,#0x24]
77
	str	r10, [r0,#0x30]
78
	str	r1, [r0,#0x34]
79
	str	r9, [r0,#0x40]
80
	str	r1, [r0,#0x44]
81
	str	r11, [r0,#0x50]
82
	str	r1, [r0,#0x54]
83
	str	r12, [r0,#0x60]
84
	str	r1, [r0,#0x64]
85
	str	r13, [r0,#0xa0]
86
	str	r1, [r0,#0xa4]
87
	str	r5, [r0,#0xb0]
88
	mov	r3, #1
89
	str	r3, [r0,#0xb4]
90
	str	r6, [r0,#0xc0]
91
	ldmia	lr, {r4-r14}
92
	str	r1, [r0,#0xc4]
93
	str	r6, [r0,#0xd0]
94
	str	r1, [r0,#0xd4]
95
	str	r6, [r0,#0xe0]
96
	str	r1, [r0,#0xe4]
97
	str	r7, [r0,#0xf0]
98
	str	r1, [r0,#0xf4]
99
	ldr	r3, [r8,#0x24]
100
	orr	r3, r3, #3
101
	str	r3, [r8,#0x24]
102
	ldr	r3, [r8,#0x28]
103
	bic	r3, r3, #0x4000
104
	str	r3, [r8,#0x28]
105
	mov	r3, #0x3C400000
106
	str	r1, [r3]
107
	str	r12, [r8,#0x0c]
108
	ldr	r3, [r8,#0x24]
109
	orr	r3, r3, #0x54
110
	str	r3, [r8,#0x24]
111
	mov	r3, #0x2000
112
waitpll1:
113
	subs	r3, r3, #1
114
	bne	waitpll1
115
	ldr	r3, [r8]
116
	bic	r3, r3, r5
117
	orr	r3, r3, r4
118
	str	r3, [r8]
119
	ldr	r3, [r8,#0x24]
120
	bic	r3, r3, #1
121
	str	r3, [r8,#0x24]
122
	mov	r3, #0x84
123
	str	r3, [r0,#0x68]
124
	str	r13, [r8,#0x04]
125
	mov	r3, #0xa000
126
waitpll2:
127
	subs	r3, r3, #1
128
	bne	waitpll2
129
	ldr	r3, [r8,#0x24]
130
	orr	r3, r3, #1
131
	str	r3, [r8,#0x24]
132
	mov	r3, #0x6000
133
waitpll3:
134
	subs	r3, r3, #1
135
	bne	waitpll3
136
	ldr	r3, [r8]
137
	bic	r3, r3, r9
138
	orr	r3, r3, r10
139
	str	r3, [r8]
140
	ldr	r3, [r8,#0x3c]
141
	bic	r3, r3, #0x400
142
	orr	r3, r3, #0x280
143
	str	r3, [r8,#0x3c]
144
	ldr	r3, [r8,#0x10]
145
	bic	r3, r3, #0x1f8
146
	orr	r3, r3, #0x37
147
	str	r3, [r8,#0x10]
148
	mrc     p15, 0, r3,c1,c0
149
	orr     r3, r3, #0xc0000000
150
	mcr     p15, 0, r3,c1,c0
151
	str	r11, [r8,#0x28]
152
	str	r14, [r8,#0x40]
153
	sub	r6, r0, #0x00800000
154
	mov	r5, #0xf700
155
	str	r5, [r6,#0x88]
156
	mov	r5, #0x1100
157
	orr	r5, r5, #0x11
158
	str	r5, [r0,#0x88]
159
	add	r4, r6, #0x00200000
160
	str	r1, [r4,#0x08]
194 theseven 161
	mov	r5, #0xf3
163 theseven 162
	str	r5, [r4]
163
	mov	r5, #0x10
164
	str	r5, [r4,#0x04]
165
	b	setuppmu
166
 
167
pmuinitdata:
168
	.byte 3, 0x39, 0x18, 0, 0x8c
194 theseven 169
	.byte 9, 0x13, 3, 0, 0, 7, 0, 5, 2, 0x6b, 0
163 theseven 170
	.byte 4, 0x1e, 0x12, 1, 0, 0x10
171
	.byte 6, 0x22, 0x2f, 1, 0, 0x10, 9, 1
172
	.byte 6, 0x31, 0x15, 1, 0x0f, 3, 0x15, 0
173
	.byte 1, 0x43, 0
174
	.byte 1, 0x4e, 0
175
	.byte 1, 0x58, 0
176
	.byte 5, 0x07, 0xb0, 0x0f, 0xfe, 0xfc, 0xff
177
	.byte 5, 0x0d, 0xdf, 0xaa, 0x4a, 5, 0x27
178
	.byte 0
179
	.align 2
180
 
181
val_006a49a5:
182
	.word 0x006a49a5
183
 
184
values1:
185
	.word 0x3CF00000 @ R0
186
	.word 0x00001111 @ R1
187
	.word 0x00000221 @ R2
188
	.word 0x38200000 @ R3
189
val_00990999:
190
	.word 0x00990999 @ R4
191
	.word 0x41001111 @ R5
192
	.word 0x11114444 @ R6
193
	.word 0x11221111 @ R7
194
	.word 0x11001744 @ R8
195
	.word 0x33333333 @ R9
196
	.word 0x11113333 @ R10
197
	.word 0x77721151 @ R11
198
	.word 0x12111111 @ R12
199
	.word 0x11111000 @ R13
200
	.word 0x60007000 @ R4
201
	.word 0x7F007F00 @ R5
202
	.word 0x44444444 @ R6
203
	.word 0x22222221 @ R7
204
	.word 0x3C500000 @ R8
205
	.word 0xFF00FF00 @ R9
206
	.word 0x20803180 @ R10
207
	.word 0xFFDFF7CF @ R11
208
	.word 0x00061800 @ R12
209
	.word 0x00021200 @ R13
210
	.word 0xFFFFEF7E @ R14
211
 
212
setuppmu:
213
	mov	sp, pc
214
	bl	getpowerok
215
	beq	poweroff
216
	adr	r2, pmuinitdata
217
pmuinitloop:
218
	ldrb	r3, [r2], #1
219
	movs	r3, r3
220
	beq	pmuinitdone
221
	ldrb	r1, [r2], #1
222
	mov	r0, #0xe6
223
	bl	i2csend
224
	b	pmuinitloop
225
pmuinitdone:
226
	orr	r12, r12, #0x00600000
227
	mov	r1, #1
228
	ldr	r0, [r12,#0x100]
229
	bic	r0, r0, #0x0f
230
	orr	r0, r0,	#1
231
	str	r0, [r12,#0x100]
232
	str	r1, [r12,#0x10c]
233
	sub	r11, r12, #0x04d00000
234
	ldr	r0, [r11,#0x80]
235
	bic	r0, r0, #0x20000
236
	str	r0, [r11,#0x80]
237
	ldr	r0, [r11]
238
	bic	r0, r0, #0xc00
239
	orr	r0, r0, #0x500
240
	str	r0, [r11]
241
	mov	r0, #3
242
	str	r0, [r11,#0x04]
243
	mov	r0, #1
244
	bl	sleepms
245
	mov	r0, #0x200
246
	orr	r0, r0, #0xed
247
	str	r0, [r11,#0x08]
248
	ldr	r0, val_006a49a5
249
	str	r0, [r11,#0x10]
250
	mov	r0, #0x37
251
	str	r0, [r11,#0x0c]
252
	ldr	r1, [r11,#0x04]
253
	bic	r1, r1, #0x700
254
	orr	r0, r1, #0x200
255
	str	r0, [r11,#0x04]
256
	orr	r0, r1, #0x300
257
	str	r0, [r11,#0x04]
258
	str	r0, [r11,#0x04]
259
	orr	r0, r1, #0x100
260
	str	r0, [r11,#0x04]
261
	orr	r0, r1, #0x500
262
	str	r0, [r11,#0x04]
263
	ldr	r0, [r11,#0x08]
264
	orr	r0, r0, #0x1000
265
	str	r0, [r11,#0x08]
266
	ldr	r0, val_00990999
267
	str	r0, [r11,#0x38]
268
	ldr	r0, [r12,#0xf0]
269
	bic	r0, r0, #0xff000000
270
	bic	r0, r0, #0x00ff0000
271
	orr	r0, r0,	#0x22000000
272
	orr	r0, r0,	#0x00220000
273
	str	r0, [r12,#0xf0]
274
	mov	r0, #0xf0
275
	str	r0, [r12,#0xfc]
276
	sub	r10, r12, #0x00d00000
277
	ldr	r0, [r10]
278
	mov	r0, r0,lsr#20
279
	mov	r0, r0,lsl#20
280
	str	r0, [r10]
281
	mov	r1, #0x3a000
282
	orr	r1, r1, #0x980
283
	str	r1, [r10,#0x08]
284
	orr	r0, r0, #0x300000
285
	str	r0, [r10]
286
	bl	initlcd
287
	mov	r0, #0x3f
288
	mcr	p15, 0, r0,c6,c0,1   @ CS0: 4GB at offset 0 - everything
289
	mcr	p15, 0, r0,c6,c0,0   @ DS0: 4GB at offset 0 - everything
290
	mov	r0, #0x31
291
	mcr	p15, 0, r0,c6,c1,1   @ CS1: SRAM/SDRAM mirror
292
	mcr	p15, 0, r0,c6,c1,0   @ DS1: SRAM/SDRAM mirror
293
	add	r0, r0, #0x08000000
294
	mcr	p15, 0, r0,c6,c2,1   @ CS2: SDRAM
295
	mcr	p15, 0, r0,c6,c2,0   @ DS2: SDRAM
296
	mov	r0, #0x23
297
	add	r0, r0, #0x22000000
298
	mcr	p15, 0, r0,c6,c3,1   @ CS3: SRAM
299
	mcr	p15, 0, r0,c6,c3,0   @ DS3: SRAM
300
	mov	r0, #0x27
301
	add	r0, r0, #0x24000000
302
	mcr	p15, 0, r0,c6,c4,1   @ CS4: NOR flash
303
	mcr	p15, 0, r0,c6,c4,0   @ DS4: NOR flash
304
	mcr	p15, 0, r1,c6,c5,1   @ CS5: unused
305
	mcr	p15, 0, r1,c6,c5,0   @ DS5: unused
306
	mcr	p15, 0, r1,c6,c6,1   @ CS6: unused
307
	mcr	p15, 0, r1,c6,c6,0   @ DS6: unused
308
	mcr	p15, 0, r1,c6,c7,1   @ CS7: unused
309
	mcr	p15, 0, r1,c6,c7,0   @ DS7: unused
310
	mov	r0, #0x1e
311
	mcr	p15, 0, r0,c2,c0, 1  @ CS1-4: cacheable
312
	mcr	p15, 0, r0,c2,c0, 0  @ DS1-4: cacheable
313
	mcr	p15, 0, r0,c3,c0, 0  @ DS1-4: write cacheable
314
	mov	r0, #0x300
315
	add	r0, r0, #0xff
316
	mcr	p15, 0, r0,c5,c0, 1  @ CS0-4: full access
317
	mcr	p15, 0, r0,c5,c0, 0  @ DS0-4: full access
318
	mrc	p15, 0, r0,c1,c0
319
	orr	r0, r0, #5
320
	orr	r0, r0, #0x1000
321
	mcr	p15, 0, r0,c1,c0     @ Re-enable the Protection Unit and caches
170 theseven 322
	mov	r0, #0xe6
196 theseven 323
	mov	r1, #0x2a
324
	mov	r2, #6
325
	bl	i2csendbyte
326
	mov	r0, #0xe6
170 theseven 327
	mov	r1, #0x2b
328
	mov	r2, #4
329
	bl	i2csendbyte
330
	mov	r0, #0xe6
331
	mov	r1, #0x28
332
	mov	r2, #10
333
	bl	i2csendbyte
334
	mov	r0, #0xe6
335
	mov	r1, #0x29
336
	mov	r2, #1
337
	bl	i2csendbyte
413 theseven 338
	ldr	r1, _stubend + 4
163 theseven 339
	ldr	r0, _stubend
165 theseven 340
	add	r0, r1, r0
163 theseven 341
	mov	r2, #0x08000000
342
movepayloadloop:
165 theseven 343
	cmp	r0, r1
344
	ldrhi	r3, [r1], #4
163 theseven 345
	strhi	r3, [r2], #4
346
	bhi	movepayloadloop
165 theseven 347
	bl	flushcache
348
	mcr	p15, 0, r0,c7,c5
163 theseven 349
	mov	pc, #0x08000000
350
 
351
 
352
lcd_inittab_type2:
353
	.byte 5, 10
354
	.byte 3, 0xa4
355
	.byte 4, 0x01
356
	.byte 5, 150
357
	.byte 3, 0x01
358
	.byte 2, 0x01
359
	.byte 2, 0x00
360
	.byte 3, 0x02
361
	.byte 2, 0x03
362
	.byte 2, 0x00
363
	.byte 3, 0x03
364
	.byte 2, 0x12
365
	.byte 2, 0x30
366
	.byte 3, 0x08
367
	.byte 2, 0x04
368
	.byte 2, 0x04
369
	.byte 3, 0x0e
370
	.byte 4, 0x10
371
	.byte 3, 0x70
372
	.byte 2, 0x10
373
	.byte 2, 0x00
374
	.byte 3, 0x71
375
	.byte 4, 0x01
376
	.byte 3, 0x30
377
	.byte 4, 0x02
378
	.byte 3, 0x31
379
	.byte 2, 0x04
380
	.byte 2, 0x00
381
	.byte 3, 0x32
382
	.byte 4, 0x07
383
	.byte 3, 0x33
384
	.byte 2, 0x05
385
	.byte 2, 0x00
386
	.byte 3, 0x34
387
	.byte 4, 0x07
388
	.byte 3, 0x35
389
	.byte 2, 0x07
390
	.byte 2, 0x03
391
	.byte 3, 0x36
392
	.byte 2, 0x05
393
	.byte 2, 0x07
394
	.byte 3, 0x37
395
	.byte 4, 0x05
396
	.byte 3, 0x38
397
	.byte 2, 0x14
398
	.byte 2, 0x04
399
	.byte 3, 0x39
400
	.byte 4, 0x0e
401
	.byte 3, 0x40
402
	.byte 2, 0x02
403
	.byte 2, 0x02
404
	.byte 3, 0x41
405
	.byte 4, 0x03
406
	.byte 3, 0x42
407
	.byte 4, 0x00
408
	.byte 3, 0x43
409
	.byte 2, 0x02
410
	.byte 2, 0x00
411
	.byte 3, 0x44
412
	.byte 2, 0x07
413
	.byte 2, 0x07
414
	.byte 3, 0x45
415
	.byte 2, 0x04
416
	.byte 2, 0x07
417
	.byte 3, 0x46
418
	.byte 2, 0x05
419
	.byte 2, 0x05
420
	.byte 3, 0x47
421
	.byte 4, 0x02
422
	.byte 3, 0x48
423
	.byte 4, 0x04
424
	.byte 3, 0x49
425
	.byte 4, 0x04
426
	.byte 3, 0x60
427
	.byte 2, 0x02
428
	.byte 2, 0x02
429
	.byte 3, 0x61
430
	.byte 4, 0x03
431
	.byte 3, 0x62
432
	.byte 4, 0x00
433
	.byte 3, 0x63
434
	.byte 2, 0x02
435
	.byte 2, 0x00
436
	.byte 3, 0x64
437
	.byte 2, 0x07
438
	.byte 2, 0x07
439
	.byte 3, 0x65
440
	.byte 2, 0x04
441
	.byte 2, 0x07
442
	.byte 3, 0x66
443
	.byte 2, 0x05
444
	.byte 2, 0x05
445
	.byte 3, 0x68
446
	.byte 4, 0x04
447
	.byte 3, 0x69
448
	.byte 4, 0x04
449
	.byte 3, 0x07
450
	.byte 4, 0x01
451
	.byte 3, 0x18
452
	.byte 4, 0x01
453
	.byte 3, 0x10
454
	.byte 2, 0x16
455
	.byte 2, 0x90
456
	.byte 3, 0x11
457
	.byte 2, 0x01
458
	.byte 2, 0x00
459
	.byte 3, 0x12
460
	.byte 2, 0x01
461
	.byte 2, 0x17
462
	.byte 3, 0x13
463
	.byte 2, 0x0f
464
	.byte 2, 0x80
465
	.byte 3, 0x12
466
	.byte 2, 0x01
467
	.byte 2, 0x37
468
	.byte 3, 0x20
469
	.byte 4, 0x00
470
	.byte 3, 0x21
471
	.byte 4, 0x00
472
	.byte 3, 0x50
473
	.byte 4, 0x00
474
	.byte 3, 0x51
475
	.byte 4, 0xaf
476
	.byte 3, 0x52
477
	.byte 4, 0x00
478
	.byte 3, 0x53
479
	.byte 4, 0x83
480
	.byte 3, 0x90
481
	.byte 4, 0x03
482
	.byte 3, 0x91
483
	.byte 4, 0x00
484
	.byte 3, 0x92
485
	.byte 2, 0x01
486
	.byte 2, 0x01
487
	.byte 3, 0x98
488
	.byte 2, 0x04
489
	.byte 2, 0x00
490
	.byte 3, 0x99
491
	.byte 2, 0x13
492
	.byte 2, 0x02
493
	.byte 3, 0x9a
494
	.byte 2, 0x02
495
	.byte 2, 0x02
496
	.byte 3, 0x9b
497
	.byte 2, 0x02
498
	.byte 2, 0x00
499
	.byte 5, 100
500
	.byte 3, 0x07
501
	.byte 4, 0x21
502
	.byte 3, 0x12
503
	.byte 2, 0x01
504
	.byte 2, 0x37
505
	.byte 5, 1
506
	.byte 3, 0x07
507
	.byte 4, 0x21
508
	.byte 3, 0x12
509
	.byte 2, 0x11
510
	.byte 2, 0x37
511
	.byte 5, 100
512
	.byte 3, 0x07
513
	.byte 2, 0x02
514
	.byte 2, 0x33
515
	.byte 0
516
 
517
lcd_inittab_type3:
518
	.byte 1, 0x01
519
	.byte 5, 5
520
	.byte 1, 0x11
521
	.byte 5, 120
522
	.byte 1, 0x3a
523
	.byte 2, 0x65
524
	.byte 1, 0xab
525
	.byte 1, 0x35
526
	.byte 2, 0x00
527
	.byte 1, 0xf2
528
	.byte 2, 0x01
529
	.byte 1, 0xe0
530
	.byte 2, 0x71
531
	.byte 2, 0x76
532
	.byte 2, 0x25
533
	.byte 2, 0x01
534
	.byte 2, 0xa5
535
	.byte 2, 0x09
536
	.byte 2, 0x15
537
	.byte 2, 0x11
538
	.byte 1, 0xe1
539
	.byte 2, 0x40
540
	.byte 2, 0x21
541
	.byte 2, 0x64
542
	.byte 2, 0x13
543
	.byte 2, 0xf3
544
	.byte 2, 0x0b
545
	.byte 2, 0x00
546
	.byte 2, 0x00
547
	.byte 1, 0xe2
548
	.byte 2, 0x71
549
	.byte 2, 0x65
550
	.byte 2, 0x24
551
	.byte 2, 0x08
552
	.byte 2, 0x97
553
	.byte 2, 0x01
554
	.byte 2, 0x15
555
	.byte 2, 0x11
556
	.byte 1, 0xe3
557
	.byte 2, 0x51
558
	.byte 2, 0x01
559
	.byte 2, 0x62
560
	.byte 2, 0x13
561
	.byte 2, 0xf3
562
	.byte 2, 0x0b
563
	.byte 2, 0x00
564
	.byte 2, 0x00
565
	.byte 1, 0xe4
566
	.byte 2, 0x71
567
	.byte 2, 0x57
568
	.byte 2, 0x31
569
	.byte 2, 0x01
570
	.byte 2, 0x82
571
	.byte 2, 0x04
572
	.byte 2, 0x1f
573
	.byte 2, 0x11
574
	.byte 1, 0xe5
575
	.byte 2, 0x64
576
	.byte 2, 0x41
577
	.byte 2, 0x64
578
	.byte 2, 0x19
579
	.byte 2, 0xb3
580
	.byte 2, 0x09
581
	.byte 2, 0x00
582
	.byte 2, 0x00
583
	.byte 1, 0x29
584
	.byte 0
585
 
586
lcd_inittab_type7:
587
	.byte 1, 0x01
588
	.byte 5, 10
589
	.byte 1, 0xb4
590
	.byte 2, 0x00
591
	.byte 1, 0xb6
592
	.byte 2, 0x01
593
	.byte 1, 0xb7
594
	.byte 2, 0x00
595
	.byte 2, 0x00
596
	.byte 2, 0x02
597
	.byte 2, 0x00
598
	.byte 2, 0x06
599
	.byte 2, 0x26
600
	.byte 2, 0x2d
601
	.byte 2, 0x27
602
	.byte 2, 0x55
603
	.byte 2, 0x27
604
	.byte 1, 0xb8
605
	.byte 2, 0x10
606
	.byte 1, 0xb9
607
	.byte 2, 0x52
608
	.byte 2, 0x12
609
	.byte 2, 0x03
610
	.byte 1, 0xc0
611
	.byte 2, 0x0a
612
	.byte 2, 0x10
613
	.byte 2, 0x10
614
	.byte 1, 0xc2
615
	.byte 2, 0x14
616
	.byte 2, 0x23
617
	.byte 1, 0xc3
618
	.byte 2, 0x12
619
	.byte 2, 0x23
620
	.byte 1, 0xc6
621
	.byte 2, 0x48
622
	.byte 1, 0xe0
623
	.byte 2, 0x20
624
	.byte 2, 0x71
625
	.byte 2, 0x17
626
	.byte 2, 0x09
627
	.byte 2, 0x70
628
	.byte 2, 0x0c
629
	.byte 2, 0x13
630
	.byte 2, 0x25
631
	.byte 1, 0xe1
632
	.byte 2, 0x37
633
	.byte 2, 0x00
634
	.byte 2, 0x63
635
	.byte 2, 0x11
636
	.byte 2, 0xd9
637
	.byte 2, 0x00
638
	.byte 2, 0x12
639
	.byte 2, 0x01
640
	.byte 1, 0xe2
641
	.byte 2, 0x42
642
	.byte 2, 0x42
643
	.byte 2, 0x60
644
	.byte 2, 0x08
645
	.byte 2, 0xb4
646
	.byte 2, 0x07
647
	.byte 2, 0x0e
648
	.byte 2, 0x90
649
	.byte 1, 0xe3
650
	.byte 2, 0x47
651
	.byte 2, 0x60
652
	.byte 2, 0x66
653
	.byte 2, 0x09
654
	.byte 2, 0x6a
655
	.byte 2, 0x02
656
	.byte 2, 0x0e
657
	.byte 2, 0x09
658
	.byte 1, 0xe4
659
	.byte 2, 0x11
660
	.byte 2, 0x40
661
	.byte 2, 0x03
662
	.byte 2, 0x0a
663
	.byte 2, 0xc1
664
	.byte 2, 0x0d
665
	.byte 2, 0x17
666
	.byte 2, 0x30
667
	.byte 1, 0xe5
668
	.byte 2, 0x00
669
	.byte 2, 0x30
670
	.byte 2, 0x77
671
	.byte 2, 0x1c
672
	.byte 2, 0xfb
673
	.byte 2, 0x00
674
	.byte 2, 0x13
675
	.byte 2, 0x07
676
	.byte 1, 0xe6
677
	.byte 2, 0x01
678
	.byte 1, 0x35
679
	.byte 2, 0x00
680
	.byte 1, 0x36
681
	.byte 2, 0x00
682
	.byte 1, 0xf2
683
	.byte 2, 0x40
684
	.byte 1, 0xf3
685
	.byte 2, 0x50
686
	.byte 1, 0xfb
687
	.byte 2, 0x01
688
	.byte 1, 0x11
689
	.byte 5, 200
690
	.byte 1, 0xb1
691
	.byte 2, 0x16
692
	.byte 2, 0x03
693
	.byte 1, 0xb2
694
	.byte 2, 0x17
695
	.byte 2, 0x03
696
	.byte 1, 0x3a
697
	.byte 2, 0x65
698
	.byte 1, 0x29
699
	.byte 0
700
 
701
.align 2
702
 
703
lcd_initmapping:
704
	.word	lcd_inittab_type3 - lcd_initmapping_ref
705
	.word	lcd_inittab_type7 - lcd_initmapping_ref
706
	.word	lcd_inittab_type2 - lcd_initmapping_ref
707
	.word	lcd_inittab_type3 - lcd_initmapping_ref
708
 
709
initlcd:
710
	stmfd	sp!, {r4,r5,lr}
711
	bl	detectlcd
712
	sub	r12, r12, #0x04900000
713
	adr	r5, lcd_initmapping
714
	add	r5, r5, r0,lsl#2
715
	ldr	r5, [r5]
716
	add	r5, r5, pc
717
	mov	r0, #0xc00
718
lcd_initmapping_ref:
719
	orr	r0, r0, #1
720
	str	r0, [r12]
721
	mov	r0, #0x7f00
722
	orr	r0, r0, #0xff
723
	str	r0, [r12,#0x24]
724
	mov	r0, #0
725
	str	r0, [r12,#0x28]
726
	mov	r0, #1
727
	bl	sleepms
728
	mov	r0, #1
729
	str	r0, [r12,#0x28]
730
	mov	r0, #5
731
	bl	sleepms
732
initlcd_loop:
733
	adr	lr, initlcd_loop
734
	ldrb	r1, [r5], #1
735
	ldrb	r0, [r5], #1
736
	add	pc, pc, r1,lsl#2
737
	nop
738
	ldmfd	sp!, {r4,r5,pc}
739
	b	sendlcdc
740
	b	sendlcdd
741
	b	sendlcd2c
742
	b	sendlcd2d
743
	b	sleepms
744
 
745
sendlcd2c:
746
	ldr	r4, [r12,#0x1c]
747
	ands	r4, r4, #0x10
748
	bne	sendlcd2c
749
	mov	r4, r0,lsr#8
750
	str	r4, [r12,#0x04]
751
	and	r0, r0, #0xff
752
sendlcdc:
753
	ldr	r4, [r12,#0x1c]
754
	ands	r4, r4, #0x10
755
	bne	sendlcdc
756
	str	r0, [r12,#0x04]
757
	mov	pc, lr
758
sendlcd2d:
759
	ldr	r4, [r12,#0x1c]
760
	ands	r4, r4, #0x10
761
	bne	sendlcd2d
762
	mov	r4, r0,lsr#8
763
	str	r4, [r12,#0x40]
764
	and	r0, r0, #0xff
765
sendlcdd:
766
	ldr	r4, [r12,#0x1c]
767
	ands	r4, r4, #0x10
768
	bne	sendlcdd
769
	str	r0, [r12,#0x40]
770
	mov	pc, lr
771
 
772
detectlcd:
773
	mov	r12, #0x3c000000
774
	orr	r12, r12, #0xf00000
775
	ldr	r0, [r12,#0xd0]
776
	bic	r0, r0, #0x0f
777
	str	r0, [r12,#0xd0]
778
	ldr	r0, [r12,#0xe0]
779
	bic	r0, r0, #0xf0
780
	str	r0, [r12,#0xe0]
781
	ldr	r0, [r12,#0xd4]
782
	and	r0, r0, #1
783
	ldr	r1, [r12,#0xe4]
784
	and	r1, r1, #2
785
	orr	r0, r0, r1
786
	mov	pc, lr
787
 
788
getpowerok:
789
	stmfd	sp!, {lr}
790
	mov	r0, #0xe6
791
	mov	r1, #0x19
792
	bl	i2crecvbyte
793
	eor	r0, r0, #1
794
	ands	r0, r0, #1
795
	ldmnefd	sp!, {pc}
796
	mov	r0, #0xe6
797
	mov	r1, #0x4b
798
	bl	i2crecvbyte
799
	ands	r0, r0, #4
800
	movne	r0, #1
801
	ldmnefd	sp!, {pc}
802
	mov	r0, #0xe6
803
	mov	r1, #0x12
804
	bl	i2crecvbyte
805
	ands	r0, r0, #4
806
	movne	r0, #1
807
	ldmfd	sp!, {pc}
808
 
809
poweroff:
810
	mov	r0, #0xe6
811
	mov	r1, #0x0c
812
	mov	r2, #0x01
813
	bl	i2csendbyte
814
	b	poweroff
815
 
816
i2csendbyte:
817
	mov	r3, #0
818
@fallthrough
819
 
820
i2csend:
821
	stmfd	sp!, {r4,lr}
822
	mov	r12, #0x3C000000
823
	add	r12, r12, #0x00900000
824
	mov	r4, #0
825
	str	r4, [r12,#0x08]
826
	str	r0, [r12,#0x0c]
827
	mov	r4, #0xf0
828
	str	r4, [r12,#0x04]
187 theseven 829
	mov	r4, #0xb7
163 theseven 830
	str	r4, [r12]
831
	bl	i2cwait
832
	str	r1, [r12,#0x0c]
833
	str	r4, [r12]
834
	bl	i2cwait
835
	movs	r3, r3
836
	moveq	r0, r2
837
i2csend_write:
838
	ldrne	r0, [r2], #1
839
	str	r0, [r12,#0x0c]
840
	str	r4, [r12]
841
	bl	i2cwait
842
	subs	r3, r3, #1
843
	bhi	i2csend_write
844
	mov	r0, #0xd0
845
	str	r0, [r12,#0x04]
846
	str	r4, [r12]
847
i2csend_wait:
848
	ldr	r0, [r12,#0x04]
849
	tst	r0, #0x20
850
	bne	i2csend_wait
851
	ldmfd	sp!, {r4,pc}
852
 
853
i2crecvbyte:
854
	mov	r2, #0
855
	mov	r3, #1
856
@fallthrough
857
 
858
i2crecv:
859
	stmfd	sp!, {r0,r4,lr}
860
	mov	r12, #0x3C000000
861
	add	r12, r12, #0x00900000
862
	mov	r4, #0
863
	str	r4, [r12,#0x08]
864
	str	r0, [r12,#0x0c]
865
	mov	r4, #0xf0
866
	str	r4, [r12,#0x04]
187 theseven 867
	mov	r4, #0xb7
163 theseven 868
	str	r4, [r12]
869
	bl	i2cwait
870
	str	r1, [r12,#0x0c]
871
	str	r4, [r12]
872
	bl	i2cwait
873
	ldr	r0, [sp]
874
	orr	r0, r0, #1
875
	str	r1, [r12,#0x0c]
876
	mov	r0, #0xb0
877
	str	r0, [r12,#0x04]
878
	str	r4, [r12]
879
	bl	i2cwait
880
i2crecv_read:
881
	subs	r3, r3, #1
187 theseven 882
	moveq	r4, #0x37
163 theseven 883
	str	r4, [r12]
884
	bl	i2cwait
885
	ldr	r0, [r12,#0x0c]
886
	movs	r2, r2
887
	strne	r0, [r2], #1
888
	movs	r3, r3
889
	bne	i2crecv_read
890
	mov	r1, #0x90
891
	str	r1, [r12,#0x04]
187 theseven 892
	mov	r1, #0xb7
163 theseven 893
	str	r1, [r12]
894
i2crecv_wait:
895
	ldr	r1, [r12,#0x04]
896
	tst	r1, #0x20
897
	bne	i2crecv_wait
898
	ldmfd	sp!, {r0,r4,pc}
899
 
900
i2cwait:
901
	ldr	r0, [r12]
902
	tst	r0, #0x10
903
	beq	i2cwait
904
	mov	pc, lr
905
 
906
 
907
sleep10ms:
908
	mov	r0, #10
909
@ fallthrough
910
 
911
sleepms:
912
	mov	r2, #0xc8
913
	mul	r1, r0, r2
914
	mov	r2, #0x3c000000
915
	orr	r2, r2, #0x700000
916
	ldr	r0, [r2,#0x80]
917
	ldr	r0, [r2,#0x84]
918
	add	r1, r1, r0
919
sleepmsloop:
920
	ldr	r0, [r2,#0x80]
921
	ldr	r0, [r2,#0x84]
922
	cmp	r0, r1
923
	bmi	sleepmsloop
924
	mov	pc, lr
925
 
926
_stubend: