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