Improve SD Card initialization logic.
This commit is contained in:
parent
a1a46d803e
commit
a85258fa96
@ -1,18 +1,18 @@
|
||||
#define BOOTROM_ADDR 0xCE000
|
||||
unsigned char BOOTROM[] = {
|
||||
85, 170, 4, 6, 80, 82, 250, 184, 29, 229, 232, 139, 4, 232, 161, 3,
|
||||
85, 170, 4, 6, 80, 82, 250, 184, 46, 229, 232, 156, 4, 232, 161, 3,
|
||||
115, 3, 233, 186, 0, 84, 88, 57, 224, 116, 33, 62, 161, 255, 255, 62,
|
||||
199, 6, 255, 255, 170, 170, 62, 128, 62, 0, 0, 170, 62, 163, 255, 255,
|
||||
117, 10, 80, 48, 192, 176, 64, 246, 224, 88, 117, 10, 178, 1, 184, 95,
|
||||
229, 232, 84, 4, 235, 2, 48, 210, 184, 131, 2, 146, 238, 184, 132, 229,
|
||||
232, 69, 4, 49, 192, 142, 192, 38, 161, 78, 0, 186, 132, 2, 239, 232,
|
||||
84, 4, 184, 47, 230, 232, 48, 4, 38, 161, 76, 0, 186, 134, 2, 239,
|
||||
232, 67, 4, 184, 51, 230, 232, 31, 4, 184, 153, 229, 232, 25, 4, 184,
|
||||
0, 192, 38, 163, 78, 0, 232, 45, 4, 184, 47, 230, 232, 9, 4, 184,
|
||||
212, 224, 38, 163, 76, 0, 232, 29, 4, 184, 51, 230, 232, 249, 3, 184,
|
||||
174, 229, 232, 243, 3, 184, 0, 192, 38, 163, 6, 1, 232, 7, 4, 184,
|
||||
47, 230, 232, 227, 3, 184, 136, 225, 38, 163, 4, 1, 232, 247, 3, 184,
|
||||
51, 230, 232, 211, 3, 184, 64, 0, 142, 192, 38, 254, 6, 117, 0, 251,
|
||||
117, 10, 80, 48, 192, 176, 64, 246, 224, 88, 117, 10, 178, 1, 184, 112,
|
||||
229, 232, 101, 4, 235, 2, 48, 210, 184, 131, 2, 146, 238, 184, 149, 229,
|
||||
232, 86, 4, 49, 192, 142, 192, 38, 161, 78, 0, 186, 132, 2, 239, 232,
|
||||
101, 4, 184, 64, 230, 232, 65, 4, 38, 161, 76, 0, 186, 134, 2, 239,
|
||||
232, 84, 4, 184, 68, 230, 232, 48, 4, 184, 170, 229, 232, 42, 4, 184,
|
||||
0, 192, 38, 163, 78, 0, 232, 62, 4, 184, 64, 230, 232, 26, 4, 184,
|
||||
212, 224, 38, 163, 76, 0, 232, 46, 4, 184, 68, 230, 232, 10, 4, 184,
|
||||
191, 229, 232, 4, 4, 184, 0, 192, 38, 163, 6, 1, 232, 24, 4, 184,
|
||||
64, 230, 232, 244, 3, 184, 136, 225, 38, 163, 4, 1, 232, 8, 4, 184,
|
||||
68, 230, 232, 228, 3, 184, 64, 0, 142, 192, 38, 254, 6, 117, 0, 251,
|
||||
90, 88, 7, 203, 85, 86, 128, 250, 128, 116, 26, 137, 197, 137, 214, 156,
|
||||
14, 184, 47, 225, 80, 156, 186, 132, 2, 237, 80, 186, 134, 2, 237, 80,
|
||||
137, 232, 137, 242, 207, 128, 252, 21, 126, 5, 232, 113, 0, 235, 34, 128,
|
||||
@ -23,14 +23,14 @@ unsigned char BOOTROM[] = {
|
||||
2, 0, 69, 227, 152, 225, 172, 225, 67, 226, 6, 227, 110, 225, 110, 225,
|
||||
110, 225, 33, 227, 69, 227, 110, 225, 110, 225, 55, 227, 69, 227, 110, 225,
|
||||
110, 225, 69, 227, 69, 227, 110, 225, 110, 225, 69, 227, 71, 227, 80, 184,
|
||||
18, 230, 232, 35, 3, 88, 80, 136, 224, 48, 228, 232, 56, 3, 184, 51,
|
||||
230, 232, 20, 3, 88, 233, 204, 1, 0, 4, 255, 0, 0, 255, 255, 0,
|
||||
35, 230, 232, 52, 3, 88, 80, 136, 224, 48, 228, 232, 73, 3, 184, 68,
|
||||
230, 232, 37, 3, 88, 233, 204, 1, 0, 4, 255, 0, 0, 255, 255, 0,
|
||||
200, 0, 0, 0, 0, 0, 63, 0, 6, 189, 64, 0, 142, 197, 48, 228,
|
||||
38, 134, 38, 116, 0, 132, 228, 116, 1, 249, 7, 195, 132, 192, 117, 3,
|
||||
233, 161, 1, 80, 48, 228, 137, 198, 83, 232, 164, 1, 137, 197, 1, 240,
|
||||
137, 222, 131, 211, 0, 232, 203, 1, 91, 88, 115, 3, 233, 137, 1, 83,
|
||||
81, 82, 87, 80, 137, 193, 48, 237, 137, 223, 186, 130, 2, 176, 0, 238,
|
||||
81, 137, 232, 137, 243, 177, 81, 232, 139, 2, 114, 70, 186, 143, 2, 176,
|
||||
81, 137, 232, 137, 243, 177, 81, 232, 156, 2, 114, 70, 186, 143, 2, 176,
|
||||
10, 238, 186, 128, 2, 236, 60, 254, 116, 10, 186, 143, 2, 236, 132, 192,
|
||||
117, 48, 235, 238, 185, 0, 1, 82, 186, 131, 2, 236, 90, 132, 192, 252,
|
||||
116, 4, 243, 109, 235, 4, 237, 171, 226, 252, 237, 131, 197, 1, 131, 214,
|
||||
@ -40,7 +40,7 @@ unsigned char BOOTROM[] = {
|
||||
232, 13, 1, 137, 197, 1, 240, 137, 222, 131, 211, 0, 232, 52, 1, 91,
|
||||
88, 115, 3, 233, 242, 0, 30, 83, 81, 82, 87, 80, 137, 193, 48, 237,
|
||||
137, 223, 140, 192, 142, 216, 186, 130, 2, 176, 0, 238, 81, 137, 232, 137,
|
||||
243, 177, 88, 232, 239, 1, 114, 109, 186, 128, 2, 176, 254, 238, 185, 0,
|
||||
243, 177, 88, 232, 0, 2, 114, 109, 186, 128, 2, 176, 254, 238, 185, 0,
|
||||
1, 135, 247, 82, 186, 131, 2, 236, 90, 132, 192, 252, 116, 4, 243, 111,
|
||||
235, 4, 173, 239, 226, 252, 135, 254, 186, 143, 2, 176, 25, 238, 186, 128,
|
||||
2, 236, 60, 255, 117, 10, 186, 143, 2, 236, 132, 192, 117, 55, 235, 238,
|
||||
@ -60,46 +60,47 @@ unsigned char BOOTROM[] = {
|
||||
89, 90, 195, 81, 82, 232, 18, 0, 57, 211, 114, 10, 119, 4, 57, 200,
|
||||
114, 4, 249, 90, 89, 195, 248, 90, 89, 195, 186, 250, 0, 185, 63, 197,
|
||||
195, 80, 30, 83, 81, 82, 86, 184, 0, 192, 142, 216, 186, 130, 2, 176,
|
||||
1, 238, 49, 201, 186, 232, 3, 180, 134, 205, 21, 186, 128, 2, 176, 255,
|
||||
185, 80, 0, 238, 226, 253, 186, 130, 2, 176, 0, 238, 190, 93, 228, 185,
|
||||
1, 0, 180, 1, 232, 79, 0, 114, 54, 190, 99, 228, 185, 5, 0, 180,
|
||||
1, 232, 66, 0, 114, 41, 187, 100, 0, 190, 105, 228, 185, 1, 0, 180,
|
||||
1, 232, 50, 0, 190, 111, 228, 185, 1, 0, 180, 0, 232, 39, 0, 115,
|
||||
14, 156, 49, 201, 186, 232, 3, 180, 134, 205, 21, 157, 75, 117, 218, 94,
|
||||
90, 89, 91, 31, 114, 8, 184, 208, 229, 232, 108, 0, 88, 195, 184, 243,
|
||||
229, 232, 100, 0, 88, 195, 186, 128, 2, 176, 255, 238, 81, 185, 6, 0,
|
||||
252, 172, 238, 226, 252, 185, 8, 0, 236, 60, 255, 225, 251, 89, 56, 224,
|
||||
118, 3, 249, 235, 4, 248, 236, 226, 253, 176, 255, 238, 195, 64, 0, 0,
|
||||
0, 0, 149, 72, 0, 0, 1, 170, 135, 119, 0, 0, 0, 0, 1, 105,
|
||||
64, 0, 0, 0, 1, 186, 128, 2, 80, 176, 255, 238, 136, 200, 136, 252,
|
||||
239, 88, 134, 216, 239, 134, 216, 180, 1, 239, 185, 8, 0, 236, 60, 255,
|
||||
225, 251, 132, 192, 116, 1, 249, 195, 156, 30, 83, 86, 137, 198, 184, 0,
|
||||
192, 142, 216, 180, 14, 49, 219, 252, 172, 8, 192, 116, 4, 205, 16, 235,
|
||||
247, 94, 91, 31, 157, 195, 156, 30, 83, 81, 82, 86, 137, 194, 184, 0,
|
||||
192, 142, 216, 49, 219, 252, 137, 214, 177, 12, 211, 238, 131, 230, 15, 138,
|
||||
132, 13, 229, 180, 14, 205, 16, 137, 214, 177, 8, 211, 238, 131, 230, 15,
|
||||
138, 132, 13, 229, 180, 14, 205, 16, 137, 214, 177, 4, 211, 238, 131, 230,
|
||||
15, 138, 132, 13, 229, 180, 14, 205, 16, 137, 214, 131, 230, 15, 138, 132,
|
||||
13, 229, 180, 14, 205, 16, 94, 90, 89, 91, 31, 157, 195, 48, 49, 50,
|
||||
51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 66, 111, 111,
|
||||
116, 82, 79, 77, 32, 102, 111, 114, 32, 88, 84, 77, 97, 120, 32, 118,
|
||||
49, 46, 48, 13, 10, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 40,
|
||||
99, 41, 32, 50, 48, 50, 53, 32, 77, 97, 116, 116, 104, 105, 101, 117,
|
||||
32, 66, 117, 99, 99, 104, 105, 97, 110, 101, 114, 105, 13, 10, 0, 67,
|
||||
80, 85, 32, 115, 117, 112, 112, 111, 114, 116, 115, 32, 73, 78, 83, 47,
|
||||
79, 85, 84, 83, 32, 105, 110, 115, 116, 114, 117, 99, 116, 105, 111, 110,
|
||||
115, 13, 10, 0, 79, 108, 100, 32, 73, 78, 84, 49, 51, 104, 32, 86,
|
||||
101, 99, 116, 111, 114, 32, 61, 32, 0, 78, 101, 119, 32, 73, 78, 84,
|
||||
49, 51, 104, 32, 86, 101, 99, 116, 111, 114, 32, 61, 32, 0, 78, 101,
|
||||
119, 32, 70, 105, 120, 101, 100, 32, 68, 105, 115, 107, 32, 80, 97, 114,
|
||||
97, 109, 101, 116, 101, 114, 32, 84, 97, 98, 108, 101, 32, 61, 32, 0,
|
||||
83, 68, 32, 67, 97, 114, 100, 32, 105, 110, 105, 116, 105, 97, 108, 105,
|
||||
122, 101, 100, 32, 115, 117, 99, 99, 101, 115, 115, 102, 117, 108, 108, 121,
|
||||
13, 10, 0, 83, 68, 32, 67, 97, 114, 100, 32, 102, 97, 105, 108, 101,
|
||||
100, 32, 116, 111, 32, 105, 110, 105, 116, 105, 97, 108, 105, 122, 101, 13,
|
||||
10, 0, 85, 110, 115, 117, 112, 112, 111, 114, 116, 101, 100, 32, 73, 78,
|
||||
84, 49, 51, 104, 32, 70, 117, 110, 99, 116, 105, 111, 110, 32, 0, 58,
|
||||
0, 32, 0, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
1, 238, 185, 1, 0, 186, 160, 134, 180, 134, 205, 21, 186, 128, 2, 176,
|
||||
255, 185, 10, 0, 238, 226, 253, 186, 130, 2, 176, 0, 238, 187, 10, 0,
|
||||
190, 110, 228, 185, 1, 0, 180, 1, 232, 92, 0, 115, 15, 49, 201, 186,
|
||||
32, 78, 180, 134, 205, 21, 75, 117, 231, 249, 235, 52, 190, 116, 228, 185,
|
||||
5, 0, 180, 1, 232, 64, 0, 114, 39, 186, 143, 2, 176, 250, 238, 190,
|
||||
122, 228, 185, 1, 0, 180, 1, 232, 45, 0, 190, 128, 228, 185, 1, 0,
|
||||
180, 0, 232, 34, 0, 115, 9, 186, 143, 2, 236, 132, 192, 116, 224, 249,
|
||||
94, 90, 89, 91, 31, 114, 8, 184, 225, 229, 232, 108, 0, 88, 195, 184,
|
||||
4, 230, 232, 100, 0, 88, 195, 186, 128, 2, 176, 255, 238, 81, 185, 6,
|
||||
0, 252, 172, 238, 226, 252, 185, 8, 0, 236, 60, 255, 225, 251, 89, 56,
|
||||
224, 118, 3, 249, 235, 4, 248, 236, 226, 253, 176, 255, 238, 195, 64, 0,
|
||||
0, 0, 0, 149, 72, 0, 0, 1, 170, 135, 119, 0, 0, 0, 0, 1,
|
||||
105, 64, 0, 0, 0, 1, 186, 128, 2, 80, 176, 255, 238, 136, 200, 136,
|
||||
252, 239, 88, 134, 216, 239, 134, 216, 180, 1, 239, 185, 8, 0, 236, 60,
|
||||
255, 225, 251, 132, 192, 116, 1, 249, 195, 156, 30, 83, 86, 137, 198, 184,
|
||||
0, 192, 142, 216, 180, 14, 49, 219, 252, 172, 8, 192, 116, 4, 205, 16,
|
||||
235, 247, 94, 91, 31, 157, 195, 156, 30, 83, 81, 82, 86, 137, 194, 184,
|
||||
0, 192, 142, 216, 49, 219, 252, 137, 214, 177, 12, 211, 238, 131, 230, 15,
|
||||
138, 132, 30, 229, 180, 14, 205, 16, 137, 214, 177, 8, 211, 238, 131, 230,
|
||||
15, 138, 132, 30, 229, 180, 14, 205, 16, 137, 214, 177, 4, 211, 238, 131,
|
||||
230, 15, 138, 132, 30, 229, 180, 14, 205, 16, 137, 214, 131, 230, 15, 138,
|
||||
132, 30, 229, 180, 14, 205, 16, 94, 90, 89, 91, 31, 157, 195, 48, 49,
|
||||
50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 66, 111,
|
||||
111, 116, 82, 79, 77, 32, 102, 111, 114, 32, 88, 84, 77, 97, 120, 32,
|
||||
118, 49, 46, 48, 13, 10, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32,
|
||||
40, 99, 41, 32, 50, 48, 50, 53, 32, 77, 97, 116, 116, 104, 105, 101,
|
||||
117, 32, 66, 117, 99, 99, 104, 105, 97, 110, 101, 114, 105, 13, 10, 0,
|
||||
67, 80, 85, 32, 115, 117, 112, 112, 111, 114, 116, 115, 32, 73, 78, 83,
|
||||
47, 79, 85, 84, 83, 32, 105, 110, 115, 116, 114, 117, 99, 116, 105, 111,
|
||||
110, 115, 13, 10, 0, 79, 108, 100, 32, 73, 78, 84, 49, 51, 104, 32,
|
||||
86, 101, 99, 116, 111, 114, 32, 61, 32, 0, 78, 101, 119, 32, 73, 78,
|
||||
84, 49, 51, 104, 32, 86, 101, 99, 116, 111, 114, 32, 61, 32, 0, 78,
|
||||
101, 119, 32, 70, 105, 120, 101, 100, 32, 68, 105, 115, 107, 32, 80, 97,
|
||||
114, 97, 109, 101, 116, 101, 114, 32, 84, 97, 98, 108, 101, 32, 61, 32,
|
||||
0, 83, 68, 32, 67, 97, 114, 100, 32, 105, 110, 105, 116, 105, 97, 108,
|
||||
105, 122, 101, 100, 32, 115, 117, 99, 99, 101, 115, 115, 102, 117, 108, 108,
|
||||
121, 13, 10, 0, 83, 68, 32, 67, 97, 114, 100, 32, 102, 97, 105, 108,
|
||||
101, 100, 32, 116, 111, 32, 105, 110, 105, 116, 105, 97, 108, 105, 122, 101,
|
||||
13, 10, 0, 85, 110, 115, 117, 112, 112, 111, 114, 116, 101, 100, 32, 73,
|
||||
78, 84, 49, 51, 104, 32, 70, 117, 110, 99, 116, 105, 111, 110, 32, 0,
|
||||
58, 0, 32, 0, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
@ -126,5 +127,4 @@ unsigned char BOOTROM[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104};
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29};
|
||||
@ -962,14 +962,16 @@ init_sd:
|
||||
%endif
|
||||
mov dx, XTMAX_IO_BASE+2 ; chip select port
|
||||
mov al, 1 ; deassert chip select
|
||||
.power_up_delay:
|
||||
out dx, al
|
||||
xor cx, cx
|
||||
mov dx, 1000 ; microseconds
|
||||
mov cx, 0x0001
|
||||
mov dx, 0x86a0 ; 0x186a0 = 100 ms
|
||||
mov ah, 0x86 ; wait
|
||||
int 0x15
|
||||
.dummy_cycles:
|
||||
mov dx, XTMAX_IO_BASE+0 ; data port
|
||||
mov al, 0xff
|
||||
mov cx, 80 ; send 80 clock cycles
|
||||
mov cx, 10 ; send 80 clock cycles
|
||||
.synchronize:
|
||||
out dx, al
|
||||
loop .synchronize
|
||||
@ -978,6 +980,8 @@ init_sd:
|
||||
mov al, 0 ; assert chip select
|
||||
out dx, al
|
||||
.cmd0:
|
||||
mov bx, 10 ; retries
|
||||
.retry_cmd0:
|
||||
%ifdef DEBUG_IO
|
||||
mov ax, send_cmd0_msg
|
||||
call print_string
|
||||
@ -986,7 +990,16 @@ init_sd:
|
||||
mov cx, 1 ; response is 1 byte
|
||||
mov ah, 1 ; expect idle state
|
||||
call send_sd_init_cmd
|
||||
jc .exit
|
||||
jnc .cmd8
|
||||
.delay_retry_cmd0:
|
||||
xor cx, cx
|
||||
mov dx, 20000 ; microseconds
|
||||
mov ah, 0x86 ; wait
|
||||
int 0x15
|
||||
dec bx
|
||||
jnz .retry_cmd0
|
||||
stc
|
||||
jmp .exit
|
||||
.cmd8:
|
||||
%ifdef DEBUG_IO
|
||||
mov ax, send_cmd8_msg
|
||||
@ -998,7 +1011,9 @@ init_sd:
|
||||
call send_sd_init_cmd
|
||||
jc .exit
|
||||
.acmd41:
|
||||
mov bx, 100 ; retries
|
||||
mov dx, XTMAX_IO_BASE+15; timeout port
|
||||
mov al, 250 ; 2.5 s
|
||||
out dx, al
|
||||
.retry_acmd41:
|
||||
%ifdef DEBUG_IO
|
||||
mov ax, send_acmd41_msg
|
||||
@ -1008,22 +1023,19 @@ init_sd:
|
||||
mov cx, 1 ; response is 1 byte
|
||||
mov ah, 1 ; expect idle state
|
||||
call send_sd_init_cmd
|
||||
; TODO: (older cards) on error, try CMD1
|
||||
; TODO: (older cards): handle v1 vs v2
|
||||
mov si, acmd41
|
||||
mov cx, 1 ; response is 1 byte
|
||||
mov ah, 0 ; expect ready state
|
||||
call send_sd_init_cmd
|
||||
jnc .exit
|
||||
pushf
|
||||
xor cx, cx
|
||||
mov dx, 1000 ; microseconds
|
||||
mov ah, 0x86 ; wait
|
||||
int 0x15
|
||||
popf
|
||||
dec bx
|
||||
jnz .retry_acmd41
|
||||
; TODO: (older cards) send CMD16 to set block size
|
||||
mov dx, XTMAX_IO_BASE+15; timeout port
|
||||
in al, dx
|
||||
test al, al
|
||||
jz .retry_acmd41
|
||||
stc
|
||||
.exit:
|
||||
; TODO: (older cards): retrieve SDHC flag
|
||||
pop si
|
||||
pop dx
|
||||
pop cx
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user