Subversion Repositories freemyipod

Rev

Details | 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
53
	adr	r1, _stubend + 4
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]
161
	mov	r5, #0xb7
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
169
	.byte 3, 0x13, 3, 0, 0
170
	.byte 6, 0x16, 7, 0, 5, 2, 0x6b, 0
171
	.byte 4, 0x1e, 0x12, 1, 0, 0x10
172
	.byte 6, 0x22, 0x2f, 1, 0, 0x10, 9, 1
173
	.byte 6, 0x31, 0x15, 1, 0x0f, 3, 0x15, 0
174
	.byte 1, 0x43, 0
175
	.byte 1, 0x4e, 0
176
	.byte 1, 0x58, 0
177
	.byte 5, 0x07, 0xb0, 0x0f, 0xfe, 0xfc, 0xff
178
	.byte 5, 0x0d, 0xdf, 0xaa, 0x4a, 5, 0x27
179
	.byte 0
180
	.align 2
181
 
182
val_006a49a5:
183
	.word 0x006a49a5
184
 
185
values1:
186
	.word 0x3CF00000 @ R0
187
	.word 0x00001111 @ R1
188
	.word 0x00000221 @ R2
189
	.word 0x38200000 @ R3
190
val_00990999:
191
	.word 0x00990999 @ R4
192
	.word 0x41001111 @ R5
193
	.word 0x11114444 @ R6
194
	.word 0x11221111 @ R7
195
	.word 0x11001744 @ R8
196
	.word 0x33333333 @ R9
197
	.word 0x11113333 @ R10
198
	.word 0x77721151 @ R11
199
	.word 0x12111111 @ R12
200
	.word 0x11111000 @ R13
201
	.word 0x60007000 @ R4
202
	.word 0x7F007F00 @ R5
203
	.word 0x44444444 @ R6
204
	.word 0x22222221 @ R7
205
	.word 0x3C500000 @ R8
206
	.word 0xFF00FF00 @ R9
207
	.word 0x20803180 @ R10
208
	.word 0xFFDFF7CF @ R11
209
	.word 0x00061800 @ R12
210
	.word 0x00021200 @ R13
211
	.word 0xFFFFEF7E @ R14
212
 
213
setuppmu:
214
	mov	sp, pc
215
	bl	getpowerok
216
	beq	poweroff
217
	adr	r2, pmuinitdata
218
pmuinitloop:
219
	ldrb	r3, [r2], #1
220
	movs	r3, r3
221
	beq	pmuinitdone
222
	ldrb	r1, [r2], #1
223
	mov	r0, #0xe6
224
	bl	i2csend
225
	b	pmuinitloop
226
pmuinitdone:
227
	orr	r12, r12, #0x00600000
228
	mov	r1, #1
229
	ldr	r0, [r12,#0x100]
230
	bic	r0, r0, #0x0f
231
	orr	r0, r0,	#1
232
	str	r0, [r12,#0x100]
233
	str	r1, [r12,#0x10c]
234
	sub	r11, r12, #0x04d00000
235
	ldr	r0, [r11,#0x80]
236
	bic	r0, r0, #0x20000
237
	str	r0, [r11,#0x80]
238
	ldr	r0, [r11]
239
	bic	r0, r0, #0xc00
240
	orr	r0, r0, #0x500
241
	str	r0, [r11]
242
	mov	r0, #3
243
	str	r0, [r11,#0x04]
244
	mov	r0, #1
245
	bl	sleepms
246
	mov	r0, #0x200
247
	orr	r0, r0, #0xed
248
	str	r0, [r11,#0x08]
249
	ldr	r0, val_006a49a5
250
	str	r0, [r11,#0x10]
251
	mov	r0, #0x37
252
	str	r0, [r11,#0x0c]
253
	ldr	r1, [r11,#0x04]
254
	bic	r1, r1, #0x700
255
	orr	r0, r1, #0x200
256
	str	r0, [r11,#0x04]
257
	orr	r0, r1, #0x300
258
	str	r0, [r11,#0x04]
259
	str	r0, [r11,#0x04]
260
	orr	r0, r1, #0x100
261
	str	r0, [r11,#0x04]
262
	orr	r0, r1, #0x500
263
	str	r0, [r11,#0x04]
264
	ldr	r0, [r11,#0x08]
265
	orr	r0, r0, #0x1000
266
	str	r0, [r11,#0x08]
267
	ldr	r0, val_00990999
268
	str	r0, [r11,#0x38]
269
	ldr	r0, [r12,#0xf0]
270
	bic	r0, r0, #0xff000000
271
	bic	r0, r0, #0x00ff0000
272
	orr	r0, r0,	#0x22000000
273
	orr	r0, r0,	#0x00220000
274
	str	r0, [r12,#0xf0]
275
	mov	r0, #0xf0
276
	str	r0, [r12,#0xfc]
277
	sub	r10, r12, #0x00d00000
278
	ldr	r0, [r10]
279
	mov	r0, r0,lsr#20
280
	mov	r0, r0,lsl#20
281
	str	r0, [r10]
282
	mov	r1, #0x3a000
283
	orr	r1, r1, #0x980
284
	str	r1, [r10,#0x08]
285
	orr	r0, r0, #0x300000
286
	str	r0, [r10]
287
	bl	initlcd
288
	mov	r0, #0x3f
289
	mcr	p15, 0, r0,c6,c0,1   @ CS0: 4GB at offset 0 - everything
290
	mcr	p15, 0, r0,c6,c0,0   @ DS0: 4GB at offset 0 - everything
291
	mov	r0, #0x31
292
	mcr	p15, 0, r0,c6,c1,1   @ CS1: SRAM/SDRAM mirror
293
	mcr	p15, 0, r0,c6,c1,0   @ DS1: SRAM/SDRAM mirror
294
	add	r0, r0, #0x08000000
295
	mcr	p15, 0, r0,c6,c2,1   @ CS2: SDRAM
296
	mcr	p15, 0, r0,c6,c2,0   @ DS2: SDRAM
297
	mov	r0, #0x23
298
	add	r0, r0, #0x22000000
299
	mcr	p15, 0, r0,c6,c3,1   @ CS3: SRAM
300
	mcr	p15, 0, r0,c6,c3,0   @ DS3: SRAM
301
	mov	r0, #0x27
302
	add	r0, r0, #0x24000000
303
	mcr	p15, 0, r0,c6,c4,1   @ CS4: NOR flash
304
	mcr	p15, 0, r0,c6,c4,0   @ DS4: NOR flash
305
	mcr	p15, 0, r1,c6,c5,1   @ CS5: unused
306
	mcr	p15, 0, r1,c6,c5,0   @ DS5: unused
307
	mcr	p15, 0, r1,c6,c6,1   @ CS6: unused
308
	mcr	p15, 0, r1,c6,c6,0   @ DS6: unused
309
	mcr	p15, 0, r1,c6,c7,1   @ CS7: unused
310
	mcr	p15, 0, r1,c6,c7,0   @ DS7: unused
311
	mov	r0, #0x1e
312
	mcr	p15, 0, r0,c2,c0, 1  @ CS1-4: cacheable
313
	mcr	p15, 0, r0,c2,c0, 0  @ DS1-4: cacheable
314
	mcr	p15, 0, r0,c3,c0, 0  @ DS1-4: write cacheable
315
	mov	r0, #0x300
316
	add	r0, r0, #0xff
317
	mcr	p15, 0, r0,c5,c0, 1  @ CS0-4: full access
318
	mcr	p15, 0, r0,c5,c0, 0  @ DS0-4: full access
319
	mrc	p15, 0, r0,c1,c0
320
	orr	r0, r0, #5
321
	orr	r0, r0, #0x1000
322
	mcr	p15, 0, r0,c1,c0     @ Re-enable the Protection Unit and caches
323
	ldr	r0, _stubend
324
	ldr	r1, _stubend + 4
325
	add	r1, r1, r0
326
	mov	r2, #0x08000000
327
movepayloadloop:
328
	cmp	r1, r0
329
	ldrhi	r3, [r0], #4
330
	strhi	r3, [r2], #4
331
	bhi	movepayloadloop
332
	mov	pc, #0x08000000
333
 
334
 
335
lcd_inittab_type2:
336
	.byte 5, 10
337
	.byte 3, 0xa4
338
	.byte 4, 0x01
339
	.byte 5, 150
340
	.byte 3, 0x01
341
	.byte 2, 0x01
342
	.byte 2, 0x00
343
	.byte 3, 0x02
344
	.byte 2, 0x03
345
	.byte 2, 0x00
346
	.byte 3, 0x03
347
	.byte 2, 0x12
348
	.byte 2, 0x30
349
	.byte 3, 0x08
350
	.byte 2, 0x04
351
	.byte 2, 0x04
352
	.byte 3, 0x0e
353
	.byte 4, 0x10
354
	.byte 3, 0x70
355
	.byte 2, 0x10
356
	.byte 2, 0x00
357
	.byte 3, 0x71
358
	.byte 4, 0x01
359
	.byte 3, 0x30
360
	.byte 4, 0x02
361
	.byte 3, 0x31
362
	.byte 2, 0x04
363
	.byte 2, 0x00
364
	.byte 3, 0x32
365
	.byte 4, 0x07
366
	.byte 3, 0x33
367
	.byte 2, 0x05
368
	.byte 2, 0x00
369
	.byte 3, 0x34
370
	.byte 4, 0x07
371
	.byte 3, 0x35
372
	.byte 2, 0x07
373
	.byte 2, 0x03
374
	.byte 3, 0x36
375
	.byte 2, 0x05
376
	.byte 2, 0x07
377
	.byte 3, 0x37
378
	.byte 4, 0x05
379
	.byte 3, 0x38
380
	.byte 2, 0x14
381
	.byte 2, 0x04
382
	.byte 3, 0x39
383
	.byte 4, 0x0e
384
	.byte 3, 0x40
385
	.byte 2, 0x02
386
	.byte 2, 0x02
387
	.byte 3, 0x41
388
	.byte 4, 0x03
389
	.byte 3, 0x42
390
	.byte 4, 0x00
391
	.byte 3, 0x43
392
	.byte 2, 0x02
393
	.byte 2, 0x00
394
	.byte 3, 0x44
395
	.byte 2, 0x07
396
	.byte 2, 0x07
397
	.byte 3, 0x45
398
	.byte 2, 0x04
399
	.byte 2, 0x07
400
	.byte 3, 0x46
401
	.byte 2, 0x05
402
	.byte 2, 0x05
403
	.byte 3, 0x47
404
	.byte 4, 0x02
405
	.byte 3, 0x48
406
	.byte 4, 0x04
407
	.byte 3, 0x49
408
	.byte 4, 0x04
409
	.byte 3, 0x60
410
	.byte 2, 0x02
411
	.byte 2, 0x02
412
	.byte 3, 0x61
413
	.byte 4, 0x03
414
	.byte 3, 0x62
415
	.byte 4, 0x00
416
	.byte 3, 0x63
417
	.byte 2, 0x02
418
	.byte 2, 0x00
419
	.byte 3, 0x64
420
	.byte 2, 0x07
421
	.byte 2, 0x07
422
	.byte 3, 0x65
423
	.byte 2, 0x04
424
	.byte 2, 0x07
425
	.byte 3, 0x66
426
	.byte 2, 0x05
427
	.byte 2, 0x05
428
	.byte 3, 0x68
429
	.byte 4, 0x04
430
	.byte 3, 0x69
431
	.byte 4, 0x04
432
	.byte 3, 0x07
433
	.byte 4, 0x01
434
	.byte 3, 0x18
435
	.byte 4, 0x01
436
	.byte 3, 0x10
437
	.byte 2, 0x16
438
	.byte 2, 0x90
439
	.byte 3, 0x11
440
	.byte 2, 0x01
441
	.byte 2, 0x00
442
	.byte 3, 0x12
443
	.byte 2, 0x01
444
	.byte 2, 0x17
445
	.byte 3, 0x13
446
	.byte 2, 0x0f
447
	.byte 2, 0x80
448
	.byte 3, 0x12
449
	.byte 2, 0x01
450
	.byte 2, 0x37
451
	.byte 3, 0x20
452
	.byte 4, 0x00
453
	.byte 3, 0x21
454
	.byte 4, 0x00
455
	.byte 3, 0x50
456
	.byte 4, 0x00
457
	.byte 3, 0x51
458
	.byte 4, 0xaf
459
	.byte 3, 0x52
460
	.byte 4, 0x00
461
	.byte 3, 0x53
462
	.byte 4, 0x83
463
	.byte 3, 0x90
464
	.byte 4, 0x03
465
	.byte 3, 0x91
466
	.byte 4, 0x00
467
	.byte 3, 0x92
468
	.byte 2, 0x01
469
	.byte 2, 0x01
470
	.byte 3, 0x98
471
	.byte 2, 0x04
472
	.byte 2, 0x00
473
	.byte 3, 0x99
474
	.byte 2, 0x13
475
	.byte 2, 0x02
476
	.byte 3, 0x9a
477
	.byte 2, 0x02
478
	.byte 2, 0x02
479
	.byte 3, 0x9b
480
	.byte 2, 0x02
481
	.byte 2, 0x00
482
	.byte 5, 100
483
	.byte 3, 0x07
484
	.byte 4, 0x21
485
	.byte 3, 0x12
486
	.byte 2, 0x01
487
	.byte 2, 0x37
488
	.byte 5, 1
489
	.byte 3, 0x07
490
	.byte 4, 0x21
491
	.byte 3, 0x12
492
	.byte 2, 0x11
493
	.byte 2, 0x37
494
	.byte 5, 100
495
	.byte 3, 0x07
496
	.byte 2, 0x02
497
	.byte 2, 0x33
498
	.byte 0
499
 
500
lcd_inittab_type3:
501
	.byte 1, 0x01
502
	.byte 5, 5
503
	.byte 1, 0x11
504
	.byte 5, 120
505
	.byte 1, 0x3a
506
	.byte 2, 0x65
507
	.byte 1, 0xab
508
	.byte 1, 0x35
509
	.byte 2, 0x00
510
	.byte 1, 0xf2
511
	.byte 2, 0x01
512
	.byte 1, 0xe0
513
	.byte 2, 0x71
514
	.byte 2, 0x76
515
	.byte 2, 0x25
516
	.byte 2, 0x01
517
	.byte 2, 0xa5
518
	.byte 2, 0x09
519
	.byte 2, 0x15
520
	.byte 2, 0x11
521
	.byte 1, 0xe1
522
	.byte 2, 0x40
523
	.byte 2, 0x21
524
	.byte 2, 0x64
525
	.byte 2, 0x13
526
	.byte 2, 0xf3
527
	.byte 2, 0x0b
528
	.byte 2, 0x00
529
	.byte 2, 0x00
530
	.byte 1, 0xe2
531
	.byte 2, 0x71
532
	.byte 2, 0x65
533
	.byte 2, 0x24
534
	.byte 2, 0x08
535
	.byte 2, 0x97
536
	.byte 2, 0x01
537
	.byte 2, 0x15
538
	.byte 2, 0x11
539
	.byte 1, 0xe3
540
	.byte 2, 0x51
541
	.byte 2, 0x01
542
	.byte 2, 0x62
543
	.byte 2, 0x13
544
	.byte 2, 0xf3
545
	.byte 2, 0x0b
546
	.byte 2, 0x00
547
	.byte 2, 0x00
548
	.byte 1, 0xe4
549
	.byte 2, 0x71
550
	.byte 2, 0x57
551
	.byte 2, 0x31
552
	.byte 2, 0x01
553
	.byte 2, 0x82
554
	.byte 2, 0x04
555
	.byte 2, 0x1f
556
	.byte 2, 0x11
557
	.byte 1, 0xe5
558
	.byte 2, 0x64
559
	.byte 2, 0x41
560
	.byte 2, 0x64
561
	.byte 2, 0x19
562
	.byte 2, 0xb3
563
	.byte 2, 0x09
564
	.byte 2, 0x00
565
	.byte 2, 0x00
566
	.byte 1, 0x29
567
	.byte 0
568
 
569
lcd_inittab_type7:
570
	.byte 1, 0x01
571
	.byte 5, 10
572
	.byte 1, 0xb4
573
	.byte 2, 0x00
574
	.byte 1, 0xb6
575
	.byte 2, 0x01
576
	.byte 1, 0xb7
577
	.byte 2, 0x00
578
	.byte 2, 0x00
579
	.byte 2, 0x02
580
	.byte 2, 0x00
581
	.byte 2, 0x06
582
	.byte 2, 0x26
583
	.byte 2, 0x2d
584
	.byte 2, 0x27
585
	.byte 2, 0x55
586
	.byte 2, 0x27
587
	.byte 1, 0xb8
588
	.byte 2, 0x10
589
	.byte 1, 0xb9
590
	.byte 2, 0x52
591
	.byte 2, 0x12
592
	.byte 2, 0x03
593
	.byte 1, 0xc0
594
	.byte 2, 0x0a
595
	.byte 2, 0x10
596
	.byte 2, 0x10
597
	.byte 1, 0xc2
598
	.byte 2, 0x14
599
	.byte 2, 0x23
600
	.byte 1, 0xc3
601
	.byte 2, 0x12
602
	.byte 2, 0x23
603
	.byte 1, 0xc6
604
	.byte 2, 0x48
605
	.byte 1, 0xe0
606
	.byte 2, 0x20
607
	.byte 2, 0x71
608
	.byte 2, 0x17
609
	.byte 2, 0x09
610
	.byte 2, 0x70
611
	.byte 2, 0x0c
612
	.byte 2, 0x13
613
	.byte 2, 0x25
614
	.byte 1, 0xe1
615
	.byte 2, 0x37
616
	.byte 2, 0x00
617
	.byte 2, 0x63
618
	.byte 2, 0x11
619
	.byte 2, 0xd9
620
	.byte 2, 0x00
621
	.byte 2, 0x12
622
	.byte 2, 0x01
623
	.byte 1, 0xe2
624
	.byte 2, 0x42
625
	.byte 2, 0x42
626
	.byte 2, 0x60
627
	.byte 2, 0x08
628
	.byte 2, 0xb4
629
	.byte 2, 0x07
630
	.byte 2, 0x0e
631
	.byte 2, 0x90
632
	.byte 1, 0xe3
633
	.byte 2, 0x47
634
	.byte 2, 0x60
635
	.byte 2, 0x66
636
	.byte 2, 0x09
637
	.byte 2, 0x6a
638
	.byte 2, 0x02
639
	.byte 2, 0x0e
640
	.byte 2, 0x09
641
	.byte 1, 0xe4
642
	.byte 2, 0x11
643
	.byte 2, 0x40
644
	.byte 2, 0x03
645
	.byte 2, 0x0a
646
	.byte 2, 0xc1
647
	.byte 2, 0x0d
648
	.byte 2, 0x17
649
	.byte 2, 0x30
650
	.byte 1, 0xe5
651
	.byte 2, 0x00
652
	.byte 2, 0x30
653
	.byte 2, 0x77
654
	.byte 2, 0x1c
655
	.byte 2, 0xfb
656
	.byte 2, 0x00
657
	.byte 2, 0x13
658
	.byte 2, 0x07
659
	.byte 1, 0xe6
660
	.byte 2, 0x01
661
	.byte 1, 0x35
662
	.byte 2, 0x00
663
	.byte 1, 0x36
664
	.byte 2, 0x00
665
	.byte 1, 0xf2
666
	.byte 2, 0x40
667
	.byte 1, 0xf3
668
	.byte 2, 0x50
669
	.byte 1, 0xfb
670
	.byte 2, 0x01
671
	.byte 1, 0x11
672
	.byte 5, 200
673
	.byte 1, 0xb1
674
	.byte 2, 0x16
675
	.byte 2, 0x03
676
	.byte 1, 0xb2
677
	.byte 2, 0x17
678
	.byte 2, 0x03
679
	.byte 1, 0x3a
680
	.byte 2, 0x65
681
	.byte 1, 0x29
682
	.byte 0
683
 
684
.align 2
685
 
686
lcd_initmapping:
687
	.word	lcd_inittab_type3 - lcd_initmapping_ref
688
	.word	lcd_inittab_type7 - lcd_initmapping_ref
689
	.word	lcd_inittab_type2 - lcd_initmapping_ref
690
	.word	lcd_inittab_type3 - lcd_initmapping_ref
691
 
692
initlcd:
693
	stmfd	sp!, {r4,r5,lr}
694
	bl	detectlcd
695
	sub	r12, r12, #0x04900000
696
	adr	r5, lcd_initmapping
697
	add	r5, r5, r0,lsl#2
698
	ldr	r5, [r5]
699
	add	r5, r5, pc
700
	mov	r0, #0xc00
701
lcd_initmapping_ref:
702
	orr	r0, r0, #1
703
	str	r0, [r12]
704
	mov	r0, #0x7f00
705
	orr	r0, r0, #0xff
706
	str	r0, [r12,#0x24]
707
	mov	r0, #0
708
	str	r0, [r12,#0x28]
709
	mov	r0, #1
710
	bl	sleepms
711
	mov	r0, #1
712
	str	r0, [r12,#0x28]
713
	mov	r0, #5
714
	bl	sleepms
715
initlcd_loop:
716
	adr	lr, initlcd_loop
717
	ldrb	r1, [r5], #1
718
	ldrb	r0, [r5], #1
719
	add	pc, pc, r1,lsl#2
720
	nop
721
	ldmfd	sp!, {r4,r5,pc}
722
	b	sendlcdc
723
	b	sendlcdd
724
	b	sendlcd2c
725
	b	sendlcd2d
726
	b	sleepms
727
 
728
sendlcd2c:
729
	ldr	r4, [r12,#0x1c]
730
	ands	r4, r4, #0x10
731
	bne	sendlcd2c
732
	mov	r4, r0,lsr#8
733
	str	r4, [r12,#0x04]
734
	and	r0, r0, #0xff
735
sendlcdc:
736
	ldr	r4, [r12,#0x1c]
737
	ands	r4, r4, #0x10
738
	bne	sendlcdc
739
	str	r0, [r12,#0x04]
740
	mov	pc, lr
741
sendlcd2d:
742
	ldr	r4, [r12,#0x1c]
743
	ands	r4, r4, #0x10
744
	bne	sendlcd2d
745
	mov	r4, r0,lsr#8
746
	str	r4, [r12,#0x40]
747
	and	r0, r0, #0xff
748
sendlcdd:
749
	ldr	r4, [r12,#0x1c]
750
	ands	r4, r4, #0x10
751
	bne	sendlcdd
752
	str	r0, [r12,#0x40]
753
	mov	pc, lr
754
 
755
detectlcd:
756
	mov	r12, #0x3c000000
757
	orr	r12, r12, #0xf00000
758
	ldr	r0, [r12,#0xd0]
759
	bic	r0, r0, #0x0f
760
	str	r0, [r12,#0xd0]
761
	ldr	r0, [r12,#0xe0]
762
	bic	r0, r0, #0xf0
763
	str	r0, [r12,#0xe0]
764
	ldr	r0, [r12,#0xd4]
765
	and	r0, r0, #1
766
	ldr	r1, [r12,#0xe4]
767
	and	r1, r1, #2
768
	orr	r0, r0, r1
769
	mov	pc, lr
770
 
771
getpowerok:
772
	stmfd	sp!, {lr}
773
	mov	r0, #0xe6
774
	mov	r1, #0x19
775
	bl	i2crecvbyte
776
	eor	r0, r0, #1
777
	ands	r0, r0, #1
778
	ldmnefd	sp!, {pc}
779
	mov	r0, #0xe6
780
	mov	r1, #0x4b
781
	bl	i2crecvbyte
782
	ands	r0, r0, #4
783
	movne	r0, #1
784
	ldmnefd	sp!, {pc}
785
	mov	r0, #0xe6
786
	mov	r1, #0x12
787
	bl	i2crecvbyte
788
	ands	r0, r0, #4
789
	movne	r0, #1
790
	ldmfd	sp!, {pc}
791
 
792
poweroff:
793
	mov	r0, #0xe6
794
	mov	r1, #0x0c
795
	mov	r2, #0x01
796
	bl	i2csendbyte
797
	b	poweroff
798
 
799
i2csendbyte:
800
	mov	r3, #0
801
@fallthrough
802
 
803
i2csend:
804
	stmfd	sp!, {r4,lr}
805
	mov	r12, #0x3C000000
806
	add	r12, r12, #0x00900000
807
	mov	r4, #0
808
	str	r4, [r12,#0x08]
809
	str	r0, [r12,#0x0c]
810
	mov	r4, #0xf0
811
	str	r4, [r12,#0x04]
812
	mov	r4, #0xf3
813
	str	r4, [r12]
814
	bl	i2cwait
815
	str	r1, [r12,#0x0c]
816
	str	r4, [r12]
817
	bl	i2cwait
818
	movs	r3, r3
819
	moveq	r0, r2
820
i2csend_write:
821
	ldrne	r0, [r2], #1
822
	str	r0, [r12,#0x0c]
823
	str	r4, [r12]
824
	bl	i2cwait
825
	subs	r3, r3, #1
826
	bhi	i2csend_write
827
	mov	r0, #0xd0
828
	str	r0, [r12,#0x04]
829
	str	r4, [r12]
830
i2csend_wait:
831
	ldr	r0, [r12,#0x04]
832
	tst	r0, #0x20
833
	bne	i2csend_wait
834
	ldmfd	sp!, {r4,pc}
835
 
836
i2crecvbyte:
837
	mov	r2, #0
838
	mov	r3, #1
839
@fallthrough
840
 
841
i2crecv:
842
	stmfd	sp!, {r0,r4,lr}
843
	mov	r12, #0x3C000000
844
	add	r12, r12, #0x00900000
845
	mov	r4, #0
846
	str	r4, [r12,#0x08]
847
	str	r0, [r12,#0x0c]
848
	mov	r4, #0xf0
849
	str	r4, [r12,#0x04]
850
	mov	r4, #0xf3
851
	str	r4, [r12]
852
	bl	i2cwait
853
	str	r1, [r12,#0x0c]
854
	str	r4, [r12]
855
	bl	i2cwait
856
	ldr	r0, [sp]
857
	orr	r0, r0, #1
858
	str	r1, [r12,#0x0c]
859
	mov	r0, #0xb0
860
	str	r0, [r12,#0x04]
861
	str	r4, [r12]
862
	bl	i2cwait
863
i2crecv_read:
864
	subs	r3, r3, #1
865
	moveq	r4, #0x73
866
	str	r4, [r12]
867
	bl	i2cwait
868
	ldr	r0, [r12,#0x0c]
869
	movs	r2, r2
870
	strne	r0, [r2], #1
871
	movs	r3, r3
872
	bne	i2crecv_read
873
	mov	r1, #0x90
874
	str	r1, [r12,#0x04]
875
	mov	r1, #0xf3
876
	str	r1, [r12]
877
i2crecv_wait:
878
	ldr	r1, [r12,#0x04]
879
	tst	r1, #0x20
880
	bne	i2crecv_wait
881
	ldmfd	sp!, {r0,r4,pc}
882
 
883
i2cwait:
884
	ldr	r0, [r12]
885
	tst	r0, #0x10
886
	beq	i2cwait
887
	mov	pc, lr
888
 
889
 
890
sleep10ms:
891
	mov	r0, #10
892
@ fallthrough
893
 
894
sleepms:
895
	mov	r2, #0xc8
896
	mul	r1, r0, r2
897
	mov	r2, #0x3c000000
898
	orr	r2, r2, #0x700000
899
	ldr	r0, [r2,#0x80]
900
	ldr	r0, [r2,#0x84]
901
	add	r1, r1, r0
902
sleepmsloop:
903
	ldr	r0, [r2,#0x80]
904
	ldr	r0, [r2,#0x84]
905
	cmp	r0, r1
906
	bmi	sleepmsloop
907
	mov	pc, lr
908
 
909
	nop
910
	nop
911
 
912
_stubend: