Subversion Repositories freemyipod

Rev

Rev 427 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 427 Rev 436
Line 23... Line 23...
23
 
23
 
24
#include "global.h"
24
#include "global.h"
25
#include "clickwheel.h"
25
#include "clickwheel.h"
26
 
26
 
27
 
27
 
28
#define sysi ((uint8_t*)0x2203fdf0)
-
 
29
#define sysiword ((uint32_t*)0x2203fdf0)
-
 
30
 
-
 
31
uint8_t nor[0x1000] INITBSS_ATTR __attribute__((aligned(16)));
-
 
32
uint32_t* norword INITBSS_ATTR = (uint32_t*)nor;
-
 
33
 
-
 
34
void targetinit_late()
28
void targetinit_late()
35
{
29
{
36
    int i;
-
 
37
 
-
 
38
    clickwheel_init();
30
    clickwheel_init();
39
 
-
 
40
    bootflash_readraw(nor, 0x1000, sizeof(nor));
-
 
41
    uint32_t scfg_size = norword[0x401];
-
 
42
    uint32_t scfg_entrycount = norword[0x405];
-
 
43
    if (norword[0x400] == 0x53436667 && scfg_size <= 0x1000
-
 
44
     && scfg_entrycount * 0x14 + 0x18 == scfg_size)
-
 
45
    {
-
 
46
        memset(sysi, 0, 0x104);
-
 
47
        sysiword[0] = 0x53797349;
-
 
48
        sysiword[1] = 0x104;
-
 
49
        sysiword[0x21] = 0x100000;
-
 
50
        for (i = 0; i < scfg_entrycount; i++)
-
 
51
            switch (norword[0x406 + i * 5])
-
 
52
            {
-
 
53
                case 0x48774e6d: // HwNm
-
 
54
                    memcpy(&sysi[0x08], &norword[0x406 + i * 5 + 1], 16);
-
 
55
                    break;
-
 
56
                case 0x48775672: // HwVr
-
 
57
                    if (norword[0x406 + i * 5 + 1] == 0)
-
 
58
                        sysiword[0x21] = norword[0x406 + i * 5 + 2];
-
 
59
                    break;
-
 
60
                case 0x53724e6d: // SrNm
-
 
61
                    memcpy(&sysi[0x18], &norword[0x406 + i * 5 + 1], 16);
-
 
62
                    break;
-
 
63
                case 0x46774964: // FwId
-
 
64
                    if (nor[0x1018 + i * 0x14 + 7] == 0)
-
 
65
                    {
-
 
66
                        memcpy(&sysi[0x38], &norword[0x406 + i * 5 + 2], 3);
-
 
67
                        sysi[0x3b] = 2;
-
 
68
                        sysiword[0xf] = 0xa2700;
-
 
69
                    }
-
 
70
                    else memcpy(&sysi[0x38], &norword[0x406 + i * 5 + 2], 8);
-
 
71
                    memset(&sysi[0x40], 10, 0);
-
 
72
                    break;
-
 
73
                case 0x556e7443: // UntC
-
 
74
                    memcpy(&sysi[0xbc], &norword[0x406 + i * 5 + 1], 16);
-
 
75
                    break;
-
 
76
                case 0x52746341: // RtcA
-
 
77
                    if (norword[0x406 + i * 5 + 1] == 1)
-
 
78
                        sysiword[0x80] = norword[0x406 + i * 5 + 2];
-
 
79
                    break;
-
 
80
                case 0x42747279: // Btry
-
 
81
                    if (norword[0x406 + i * 5 + 1] == 1)
-
 
82
                        memcpy(&sysi[0x5c], &norword[0x406 + i * 5 + 2], 12);
-
 
83
                    break;
-
 
84
                case 0x5265676e: // Regn
-
 
85
                    if (nor[0x1018 + i * 0x14 + 4] == 1 && nor[0x1018 + i * 0x14 + 5] == 0)
-
 
86
                        memcpy(&sysi[0x92], &norword[0x406 + i * 5 + 2], 4);
-
 
87
                    break;
-
 
88
                case 0x4d6f6423: // Mod#
-
 
89
                    memcpy(&sysi[0x98], &norword[0x406 + i * 5 + 1], 16);
-
 
90
                    break;
-
 
91
                case 0x48774f31: // Hw01
-
 
92
                    memcpy(&sysi[0xa8], &norword[0x406 + i * 5 + 1], 16);
-
 
93
                    break;
-
 
94
                case 0x436f6e74: // Cont
-
 
95
                    if (nor[0x1018 + i * 0x14 + 4] == 0 && nor[0x1018 + i * 0x14 + 5] == 0)
-
 
96
                    {
-
 
97
                        sysi[0xb8] = nor[0x1018 + i * 0x14 + 6];
-
 
98
                        sysi[0xb9] = nor[0x1018 + i * 0x14 + 8];
-
 
99
                    }
-
 
100
                    break;
-
 
101
                case 0x426b4c74: // BkLt
-
 
102
                    if (nor[0x1018 + i * 0x14 + 4] == 0xaa && nor[0x1018 + i * 0x14 + 5] == 0x55)
-
 
103
                    {
-
 
104
                        sysi[0xba] = nor[0x1018 + i * 0x14 + 6];
-
 
105
                        sysi[0xbb] = nor[0x1018 + i * 0x14 + 8];
-
 
106
                    }
-
 
107
                    break;
-
 
108
                case 0x44726d56: // DrmV
-
 
109
                    memcpy(&sysi[0xce], &norword[0x406 + i * 5 + 1], 16);
-
 
110
                    break;
-
 
111
            }
-
 
112
        sysiword[2] = 0x646f5069;
-
 
113
        sysiword[3] = 0x36334e20;
-
 
114
        sysi[0x88] = 0x4e;
-
 
115
        sysi[0x89] = 0x41;
-
 
116
#ifdef TARGET_ipodclassic
-
 
117
        sysiword[0x38] = 0x4000000;
-
 
118
#else
-
 
119
        sysiword[0x38] = 0x2000000;
-
 
120
#endif
-
 
121
        sysiword[0x39] = 0x8000000;
-
 
122
        sysiword[0x3a] = 0x40000;
-
 
123
        sysiword[0x3b] = 0x22000000;
-
 
124
        sysiword[0x3c] = 0x100000;
-
 
125
        sysiword[0x3d] = 0x24000000;
-
 
126
        sysiword[0x4a] = 0x53797349;
-
 
127
        sysiword[0x4b] = 0x2203fdf0;
-
 
128
    }
-
 
129
}
31
}