Subversion Repositories freemyipod

Rev

Go to most recent revision | 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
165 theseven 323
	ldr	r1, _stubend + 4
163 theseven 324
	ldr	r0, _stubend
165 theseven 325
	add	r0, r1, r0
163 theseven 326
	mov	r2, #0x08000000
327
movepayloadloop:
165 theseven 328
	cmp	r0, r1
329
	ldrhi	r3, [r1], #4
163 theseven 330
	strhi	r3, [r2], #4
331
	bhi	movepayloadloop
165 theseven 332
	bl	flushcache
333
	mcr	p15, 0, r0,c7,c5
163 theseven 334
	mov	pc, #0x08000000
335
 
336
 
337
lcd_inittab_type2:
338
	.byte 5, 10
339
	.byte 3, 0xa4
340
	.byte 4, 0x01
341
	.byte 5, 150
342
	.byte 3, 0x01
343
	.byte 2, 0x01
344
	.byte 2, 0x00
345
	.byte 3, 0x02
346
	.byte 2, 0x03
347
	.byte 2, 0x00
348
	.byte 3, 0x03
349
	.byte 2, 0x12
350
	.byte 2, 0x30
351
	.byte 3, 0x08
352
	.byte 2, 0x04
353
	.byte 2, 0x04
354
	.byte 3, 0x0e
355
	.byte 4, 0x10
356
	.byte 3, 0x70
357
	.byte 2, 0x10
358
	.byte 2, 0x00
359
	.byte 3, 0x71
360
	.byte 4, 0x01
361
	.byte 3, 0x30
362
	.byte 4, 0x02
363
	.byte 3, 0x31
364
	.byte 2, 0x04
365
	.byte 2, 0x00
366
	.byte 3, 0x32
367
	.byte 4, 0x07
368
	.byte 3, 0x33
369
	.byte 2, 0x05
370
	.byte 2, 0x00
371
	.byte 3, 0x34
372
	.byte 4, 0x07
373
	.byte 3, 0x35
374
	.byte 2, 0x07
375
	.byte 2, 0x03
376
	.byte 3, 0x36
377
	.byte 2, 0x05
378
	.byte 2, 0x07
379
	.byte 3, 0x37
380
	.byte 4, 0x05
381
	.byte 3, 0x38
382
	.byte 2, 0x14
383
	.byte 2, 0x04
384
	.byte 3, 0x39
385
	.byte 4, 0x0e
386
	.byte 3, 0x40
387
	.byte 2, 0x02
388
	.byte 2, 0x02
389
	.byte 3, 0x41
390
	.byte 4, 0x03
391
	.byte 3, 0x42
392
	.byte 4, 0x00
393
	.byte 3, 0x43
394
	.byte 2, 0x02
395
	.byte 2, 0x00
396
	.byte 3, 0x44
397
	.byte 2, 0x07
398
	.byte 2, 0x07
399
	.byte 3, 0x45
400
	.byte 2, 0x04
401
	.byte 2, 0x07
402
	.byte 3, 0x46
403
	.byte 2, 0x05
404
	.byte 2, 0x05
405
	.byte 3, 0x47
406
	.byte 4, 0x02
407
	.byte 3, 0x48
408
	.byte 4, 0x04
409
	.byte 3, 0x49
410
	.byte 4, 0x04
411
	.byte 3, 0x60
412
	.byte 2, 0x02
413
	.byte 2, 0x02
414
	.byte 3, 0x61
415
	.byte 4, 0x03
416
	.byte 3, 0x62
417
	.byte 4, 0x00
418
	.byte 3, 0x63
419
	.byte 2, 0x02
420
	.byte 2, 0x00
421
	.byte 3, 0x64
422
	.byte 2, 0x07
423
	.byte 2, 0x07
424
	.byte 3, 0x65
425
	.byte 2, 0x04
426
	.byte 2, 0x07
427
	.byte 3, 0x66
428
	.byte 2, 0x05
429
	.byte 2, 0x05
430
	.byte 3, 0x68
431
	.byte 4, 0x04
432
	.byte 3, 0x69
433
	.byte 4, 0x04
434
	.byte 3, 0x07
435
	.byte 4, 0x01
436
	.byte 3, 0x18
437
	.byte 4, 0x01
438
	.byte 3, 0x10
439
	.byte 2, 0x16
440
	.byte 2, 0x90
441
	.byte 3, 0x11
442
	.byte 2, 0x01
443
	.byte 2, 0x00
444
	.byte 3, 0x12
445
	.byte 2, 0x01
446
	.byte 2, 0x17
447
	.byte 3, 0x13
448
	.byte 2, 0x0f
449
	.byte 2, 0x80
450
	.byte 3, 0x12
451
	.byte 2, 0x01
452
	.byte 2, 0x37
453
	.byte 3, 0x20
454
	.byte 4, 0x00
455
	.byte 3, 0x21
456
	.byte 4, 0x00
457
	.byte 3, 0x50
458
	.byte 4, 0x00
459
	.byte 3, 0x51
460
	.byte 4, 0xaf
461
	.byte 3, 0x52
462
	.byte 4, 0x00
463
	.byte 3, 0x53
464
	.byte 4, 0x83
465
	.byte 3, 0x90
466
	.byte 4, 0x03
467
	.byte 3, 0x91
468
	.byte 4, 0x00
469
	.byte 3, 0x92
470
	.byte 2, 0x01
471
	.byte 2, 0x01
472
	.byte 3, 0x98
473
	.byte 2, 0x04
474
	.byte 2, 0x00
475
	.byte 3, 0x99
476
	.byte 2, 0x13
477
	.byte 2, 0x02
478
	.byte 3, 0x9a
479
	.byte 2, 0x02
480
	.byte 2, 0x02
481
	.byte 3, 0x9b
482
	.byte 2, 0x02
483
	.byte 2, 0x00
484
	.byte 5, 100
485
	.byte 3, 0x07
486
	.byte 4, 0x21
487
	.byte 3, 0x12
488
	.byte 2, 0x01
489
	.byte 2, 0x37
490
	.byte 5, 1
491
	.byte 3, 0x07
492
	.byte 4, 0x21
493
	.byte 3, 0x12
494
	.byte 2, 0x11
495
	.byte 2, 0x37
496
	.byte 5, 100
497
	.byte 3, 0x07
498
	.byte 2, 0x02
499
	.byte 2, 0x33
500
	.byte 0
501
 
502
lcd_inittab_type3:
503
	.byte 1, 0x01
504
	.byte 5, 5
505
	.byte 1, 0x11
506
	.byte 5, 120
507
	.byte 1, 0x3a
508
	.byte 2, 0x65
509
	.byte 1, 0xab
510
	.byte 1, 0x35
511
	.byte 2, 0x00
512
	.byte 1, 0xf2
513
	.byte 2, 0x01
514
	.byte 1, 0xe0
515
	.byte 2, 0x71
516
	.byte 2, 0x76
517
	.byte 2, 0x25
518
	.byte 2, 0x01
519
	.byte 2, 0xa5
520
	.byte 2, 0x09
521
	.byte 2, 0x15
522
	.byte 2, 0x11
523
	.byte 1, 0xe1
524
	.byte 2, 0x40
525
	.byte 2, 0x21
526
	.byte 2, 0x64
527
	.byte 2, 0x13
528
	.byte 2, 0xf3
529
	.byte 2, 0x0b
530
	.byte 2, 0x00
531
	.byte 2, 0x00
532
	.byte 1, 0xe2
533
	.byte 2, 0x71
534
	.byte 2, 0x65
535
	.byte 2, 0x24
536
	.byte 2, 0x08
537
	.byte 2, 0x97
538
	.byte 2, 0x01
539
	.byte 2, 0x15
540
	.byte 2, 0x11
541
	.byte 1, 0xe3
542
	.byte 2, 0x51
543
	.byte 2, 0x01
544
	.byte 2, 0x62
545
	.byte 2, 0x13
546
	.byte 2, 0xf3
547
	.byte 2, 0x0b
548
	.byte 2, 0x00
549
	.byte 2, 0x00
550
	.byte 1, 0xe4
551
	.byte 2, 0x71
552
	.byte 2, 0x57
553
	.byte 2, 0x31
554
	.byte 2, 0x01
555
	.byte 2, 0x82
556
	.byte 2, 0x04
557
	.byte 2, 0x1f
558
	.byte 2, 0x11
559
	.byte 1, 0xe5
560
	.byte 2, 0x64
561
	.byte 2, 0x41
562
	.byte 2, 0x64
563
	.byte 2, 0x19
564
	.byte 2, 0xb3
565
	.byte 2, 0x09
566
	.byte 2, 0x00
567
	.byte 2, 0x00
568
	.byte 1, 0x29
569
	.byte 0
570
 
571
lcd_inittab_type7:
572
	.byte 1, 0x01
573
	.byte 5, 10
574
	.byte 1, 0xb4
575
	.byte 2, 0x00
576
	.byte 1, 0xb6
577
	.byte 2, 0x01
578
	.byte 1, 0xb7
579
	.byte 2, 0x00
580
	.byte 2, 0x00
581
	.byte 2, 0x02
582
	.byte 2, 0x00
583
	.byte 2, 0x06
584
	.byte 2, 0x26
585
	.byte 2, 0x2d
586
	.byte 2, 0x27
587
	.byte 2, 0x55
588
	.byte 2, 0x27
589
	.byte 1, 0xb8
590
	.byte 2, 0x10
591
	.byte 1, 0xb9
592
	.byte 2, 0x52
593
	.byte 2, 0x12
594
	.byte 2, 0x03
595
	.byte 1, 0xc0
596
	.byte 2, 0x0a
597
	.byte 2, 0x10
598
	.byte 2, 0x10
599
	.byte 1, 0xc2
600
	.byte 2, 0x14
601
	.byte 2, 0x23
602
	.byte 1, 0xc3
603
	.byte 2, 0x12
604
	.byte 2, 0x23
605
	.byte 1, 0xc6
606
	.byte 2, 0x48
607
	.byte 1, 0xe0
608
	.byte 2, 0x20
609
	.byte 2, 0x71
610
	.byte 2, 0x17
611
	.byte 2, 0x09
612
	.byte 2, 0x70
613
	.byte 2, 0x0c
614
	.byte 2, 0x13
615
	.byte 2, 0x25
616
	.byte 1, 0xe1
617
	.byte 2, 0x37
618
	.byte 2, 0x00
619
	.byte 2, 0x63
620
	.byte 2, 0x11
621
	.byte 2, 0xd9
622
	.byte 2, 0x00
623
	.byte 2, 0x12
624
	.byte 2, 0x01
625
	.byte 1, 0xe2
626
	.byte 2, 0x42
627
	.byte 2, 0x42
628
	.byte 2, 0x60
629
	.byte 2, 0x08
630
	.byte 2, 0xb4
631
	.byte 2, 0x07
632
	.byte 2, 0x0e
633
	.byte 2, 0x90
634
	.byte 1, 0xe3
635
	.byte 2, 0x47
636
	.byte 2, 0x60
637
	.byte 2, 0x66
638
	.byte 2, 0x09
639
	.byte 2, 0x6a
640
	.byte 2, 0x02
641
	.byte 2, 0x0e
642
	.byte 2, 0x09
643
	.byte 1, 0xe4
644
	.byte 2, 0x11
645
	.byte 2, 0x40
646
	.byte 2, 0x03
647
	.byte 2, 0x0a
648
	.byte 2, 0xc1
649
	.byte 2, 0x0d
650
	.byte 2, 0x17
651
	.byte 2, 0x30
652
	.byte 1, 0xe5
653
	.byte 2, 0x00
654
	.byte 2, 0x30
655
	.byte 2, 0x77
656
	.byte 2, 0x1c
657
	.byte 2, 0xfb
658
	.byte 2, 0x00
659
	.byte 2, 0x13
660
	.byte 2, 0x07
661
	.byte 1, 0xe6
662
	.byte 2, 0x01
663
	.byte 1, 0x35
664
	.byte 2, 0x00
665
	.byte 1, 0x36
666
	.byte 2, 0x00
667
	.byte 1, 0xf2
668
	.byte 2, 0x40
669
	.byte 1, 0xf3
670
	.byte 2, 0x50
671
	.byte 1, 0xfb
672
	.byte 2, 0x01
673
	.byte 1, 0x11
674
	.byte 5, 200
675
	.byte 1, 0xb1
676
	.byte 2, 0x16
677
	.byte 2, 0x03
678
	.byte 1, 0xb2
679
	.byte 2, 0x17
680
	.byte 2, 0x03
681
	.byte 1, 0x3a
682
	.byte 2, 0x65
683
	.byte 1, 0x29
684
	.byte 0
685
 
686
.align 2
687
 
688
lcd_initmapping:
689
	.word	lcd_inittab_type3 - lcd_initmapping_ref
690
	.word	lcd_inittab_type7 - lcd_initmapping_ref
691
	.word	lcd_inittab_type2 - lcd_initmapping_ref
692
	.word	lcd_inittab_type3 - lcd_initmapping_ref
693
 
694
initlcd:
695
	stmfd	sp!, {r4,r5,lr}
696
	bl	detectlcd
697
	sub	r12, r12, #0x04900000
698
	adr	r5, lcd_initmapping
699
	add	r5, r5, r0,lsl#2
700
	ldr	r5, [r5]
701
	add	r5, r5, pc
702
	mov	r0, #0xc00
703
lcd_initmapping_ref:
704
	orr	r0, r0, #1
705
	str	r0, [r12]
706
	mov	r0, #0x7f00
707
	orr	r0, r0, #0xff
708
	str	r0, [r12,#0x24]
709
	mov	r0, #0
710
	str	r0, [r12,#0x28]
711
	mov	r0, #1
712
	bl	sleepms
713
	mov	r0, #1
714
	str	r0, [r12,#0x28]
715
	mov	r0, #5
716
	bl	sleepms
717
initlcd_loop:
718
	adr	lr, initlcd_loop
719
	ldrb	r1, [r5], #1
720
	ldrb	r0, [r5], #1
721
	add	pc, pc, r1,lsl#2
722
	nop
723
	ldmfd	sp!, {r4,r5,pc}
724
	b	sendlcdc
725
	b	sendlcdd
726
	b	sendlcd2c
727
	b	sendlcd2d
728
	b	sleepms
729
 
730
sendlcd2c:
731
	ldr	r4, [r12,#0x1c]
732
	ands	r4, r4, #0x10
733
	bne	sendlcd2c
734
	mov	r4, r0,lsr#8
735
	str	r4, [r12,#0x04]
736
	and	r0, r0, #0xff
737
sendlcdc:
738
	ldr	r4, [r12,#0x1c]
739
	ands	r4, r4, #0x10
740
	bne	sendlcdc
741
	str	r0, [r12,#0x04]
742
	mov	pc, lr
743
sendlcd2d:
744
	ldr	r4, [r12,#0x1c]
745
	ands	r4, r4, #0x10
746
	bne	sendlcd2d
747
	mov	r4, r0,lsr#8
748
	str	r4, [r12,#0x40]
749
	and	r0, r0, #0xff
750
sendlcdd:
751
	ldr	r4, [r12,#0x1c]
752
	ands	r4, r4, #0x10
753
	bne	sendlcdd
754
	str	r0, [r12,#0x40]
755
	mov	pc, lr
756
 
757
detectlcd:
758
	mov	r12, #0x3c000000
759
	orr	r12, r12, #0xf00000
760
	ldr	r0, [r12,#0xd0]
761
	bic	r0, r0, #0x0f
762
	str	r0, [r12,#0xd0]
763
	ldr	r0, [r12,#0xe0]
764
	bic	r0, r0, #0xf0
765
	str	r0, [r12,#0xe0]
766
	ldr	r0, [r12,#0xd4]
767
	and	r0, r0, #1
768
	ldr	r1, [r12,#0xe4]
769
	and	r1, r1, #2
770
	orr	r0, r0, r1
771
	mov	pc, lr
772
 
773
getpowerok:
774
	stmfd	sp!, {lr}
775
	mov	r0, #0xe6
776
	mov	r1, #0x19
777
	bl	i2crecvbyte
778
	eor	r0, r0, #1
779
	ands	r0, r0, #1
780
	ldmnefd	sp!, {pc}
781
	mov	r0, #0xe6
782
	mov	r1, #0x4b
783
	bl	i2crecvbyte
784
	ands	r0, r0, #4
785
	movne	r0, #1
786
	ldmnefd	sp!, {pc}
787
	mov	r0, #0xe6
788
	mov	r1, #0x12
789
	bl	i2crecvbyte
790
	ands	r0, r0, #4
791
	movne	r0, #1
792
	ldmfd	sp!, {pc}
793
 
794
poweroff:
795
	mov	r0, #0xe6
796
	mov	r1, #0x0c
797
	mov	r2, #0x01
798
	bl	i2csendbyte
799
	b	poweroff
800
 
801
i2csendbyte:
802
	mov	r3, #0
803
@fallthrough
804
 
805
i2csend:
806
	stmfd	sp!, {r4,lr}
807
	mov	r12, #0x3C000000
808
	add	r12, r12, #0x00900000
809
	mov	r4, #0
810
	str	r4, [r12,#0x08]
811
	str	r0, [r12,#0x0c]
812
	mov	r4, #0xf0
813
	str	r4, [r12,#0x04]
814
	mov	r4, #0xf3
815
	str	r4, [r12]
816
	bl	i2cwait
817
	str	r1, [r12,#0x0c]
818
	str	r4, [r12]
819
	bl	i2cwait
820
	movs	r3, r3
821
	moveq	r0, r2
822
i2csend_write:
823
	ldrne	r0, [r2], #1
824
	str	r0, [r12,#0x0c]
825
	str	r4, [r12]
826
	bl	i2cwait
827
	subs	r3, r3, #1
828
	bhi	i2csend_write
829
	mov	r0, #0xd0
830
	str	r0, [r12,#0x04]
831
	str	r4, [r12]
832
i2csend_wait:
833
	ldr	r0, [r12,#0x04]
834
	tst	r0, #0x20
835
	bne	i2csend_wait
836
	ldmfd	sp!, {r4,pc}
837
 
838
i2crecvbyte:
839
	mov	r2, #0
840
	mov	r3, #1
841
@fallthrough
842
 
843
i2crecv:
844
	stmfd	sp!, {r0,r4,lr}
845
	mov	r12, #0x3C000000
846
	add	r12, r12, #0x00900000
847
	mov	r4, #0
848
	str	r4, [r12,#0x08]
849
	str	r0, [r12,#0x0c]
850
	mov	r4, #0xf0
851
	str	r4, [r12,#0x04]
852
	mov	r4, #0xf3
853
	str	r4, [r12]
854
	bl	i2cwait
855
	str	r1, [r12,#0x0c]
856
	str	r4, [r12]
857
	bl	i2cwait
858
	ldr	r0, [sp]
859
	orr	r0, r0, #1
860
	str	r1, [r12,#0x0c]
861
	mov	r0, #0xb0
862
	str	r0, [r12,#0x04]
863
	str	r4, [r12]
864
	bl	i2cwait
865
i2crecv_read:
866
	subs	r3, r3, #1
867
	moveq	r4, #0x73
868
	str	r4, [r12]
869
	bl	i2cwait
870
	ldr	r0, [r12,#0x0c]
871
	movs	r2, r2
872
	strne	r0, [r2], #1
873
	movs	r3, r3
874
	bne	i2crecv_read
875
	mov	r1, #0x90
876
	str	r1, [r12,#0x04]
877
	mov	r1, #0xf3
878
	str	r1, [r12]
879
i2crecv_wait:
880
	ldr	r1, [r12,#0x04]
881
	tst	r1, #0x20
882
	bne	i2crecv_wait
883
	ldmfd	sp!, {r0,r4,pc}
884
 
885
i2cwait:
886
	ldr	r0, [r12]
887
	tst	r0, #0x10
888
	beq	i2cwait
889
	mov	pc, lr
890
 
891
 
892
sleep10ms:
893
	mov	r0, #10
894
@ fallthrough
895
 
896
sleepms:
897
	mov	r2, #0xc8
898
	mul	r1, r0, r2
899
	mov	r2, #0x3c000000
900
	orr	r2, r2, #0x700000
901
	ldr	r0, [r2,#0x80]
902
	ldr	r0, [r2,#0x84]
903
	add	r1, r1, r0
904
sleepmsloop:
905
	ldr	r0, [r2,#0x80]
906
	ldr	r0, [r2,#0x84]
907
	cmp	r0, r1
908
	bmi	sleepmsloop
909
	mov	pc, lr
910
 
911
_stubend: