Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit432935e

Browse files
author
k
committed
Revert "misc cleanup"
This reverts commit109b260.
1 parent109b260 commit432935e

File tree

9 files changed

+150
-32
lines changed

9 files changed

+150
-32
lines changed

‎Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ SRCS = \
2222
drivers/BCM2708ArmControl.cc\
2323
drivers/BCM2708ClockDomains.cc\
2424
drivers/BCM2708Gpio.cc\
25-
BCM2708PlatformStartup.cc
25+
BCM2708PlatformStartup.cc\
26+
chainloader_inc.s
2627

2728
ARCH = vc4
2829

‎arm_chainloader/drivers/mbr_disk.cc

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ struct MbrPartition {
3737
uint8_tpart_ehd;/* end head*/
3838
uint8_tpart_esect;/* end sector*/
3939
uint8_tpart_ecyl;/* end cylinder*/
40+
#if0
41+
uint16_tpart_start_lo;/* absolute starting ... */
42+
uint16_tpart_start_hi;/* ... sector number */
43+
uint16_tpart_size_lo;/* partition size ... */
44+
uint16_tpart_size_hi;/* ... in sectors */
45+
#endif
4046
uint32_t part_start;
4147
uint32_t part_size;
4248
} __attribute__((packed));
@@ -49,13 +55,34 @@ struct Mbr {
4955
uint16_t mbr_sig;
5056
} __attribute__((packed));
5157

58+
static_assert(sizeof(Mbr) >= 512, "What the fuck");
59+
5260
#defineMBR_FAT160x04
5361
#defineMBR_FAT320x0B
5462
#defineMBR_FAT32_INT130x0C
5563
#defineMBR_FAT16_INT130x0E
5664
#defineMBR_LINUX0x83
5765
#defineMBR_NTFS0x07
5866

67+
staticconstchar*mbr_fs_to_string(int fs) {
68+
switch (fs) {
69+
case MBR_FAT32:
70+
return"FAT32";
71+
case MBR_FAT32_INT13:
72+
return"FAT32-INT13";
73+
case MBR_FAT16_INT13:
74+
return"FAT16-INT13";
75+
case MBR_FAT16:
76+
return"FAT16";
77+
case MBR_LINUX:
78+
return"Linux (ext2/ext3)";
79+
case MBR_NTFS:
80+
return"NTFS";
81+
default:
82+
return"<Unknown>";
83+
}
84+
}
85+
5986
structMbrImpl {
6087
Mbr* mbr;
6188
BlockDevice* mmc;
@@ -94,19 +121,28 @@ struct MbrImpl {
94121
voidread_mbr() {
95122
logf("Reading master boot record ...\n");
96123

97-
if (!mmc->read_block(0, mbr))
124+
if (!mmc->read_block(0, mbr)) {
98125
panic("unable to read master boot record from the SD card");
126+
}
99127

100-
if (!validate_signature())
128+
if (!validate_signature()) {
101129
panic("invalid master boot record signature (got 0x%x)", mbr->mbr_sig);
130+
}
131+
132+
logf("MBR contents:\n");
133+
134+
for (int i =0; i <4; i++) {
135+
MbrPartition& p = mbr->mbr_part[i];
136+
printf(" %d: %s at:%d size:%d\n", i,mbr_fs_to_string(p.part_typ), p.part_start, p.part_size);
137+
}
102138
}
103139

104140
MbrImpl() {
105141
mbr =new Mbr;
106142
mmc =get_sdhost_device();
107-
if (!mmc)
143+
if (!mmc) {
108144
panic("parent block device not initilalized!");
109-
145+
}
110146
read_mbr();
111147
logf("Disk ready!\n");
112148
}

‎arm_chainloader/drivers/sdhost_impl.cc

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,21 +134,24 @@ struct BCM2708SDHost : BlockDevice {
134134
}
135135

136136
voidconfigure_pinmux() {
137-
logf("configuring pinmux ...\n");
138-
139137
GP_FSEL4 =0x24000000;
140138
GP_FSEL5 =0x924;
141139

140+
logf("waiting for pinmux pull update ...\n");
141+
142142
GP_PUD =2;
143143
mfence();
144144
udelay(500);
145145
GP_PUD =0;
146146

147-
/* are these in bank 1 or 2?*/
147+
logf("waiting for pinmux clock update ...\n");
148+
149+
/* are these in bank 1 or 2? ah who gives a fuck ...*/
148150
GP_PUDCLK1 = GP_PUDCLK1_PUDCLKn32_SET;
149151
GP_PUDCLK2 = GP_PUDCLK2_PUDCLKn64_SET;
150152
udelay(500);
151153

154+
logf("ok ...\n");
152155
GP_PUDCLK1 =0;
153156
GP_PUDCLK2 =0;
154157

@@ -197,6 +200,8 @@ struct BCM2708SDHost : BlockDevice {
197200

198201
get_response();
199202

203+
//printf("Cmd: 0x%x Resp: %08x %08x %08x %08x\n", current_cmd, r[0], r[1], r[2], r[3]);
204+
200205
if (SH_CMD & SH_CMD_FAIL_FLAG_SET) {
201206
if (SH_HSTS & SDHSTS_ERROR_MASK) {
202207
logf("ERROR: sdhost status: 0x%x\n", SH_HSTS);
@@ -241,6 +246,11 @@ struct BCM2708SDHost : BlockDevice {
241246

242247
logf("SD card has arrived!\n", r);
243248

249+
is_high_capacity = (r[0] & MMC_OCR_HCS) == MMC_OCR_HCS;
250+
251+
if (is_high_capacity)
252+
logf("This is an SDHC card!\n");
253+
244254
returntrue;
245255

246256
}
@@ -265,6 +275,8 @@ struct BCM2708SDHost : BlockDevice {
265275
returnfalse;
266276
rca =SD_R6_RCA(r);
267277

278+
logf("RCA = 0x%x\n", rca);
279+
268280
send_136_resp(MMC_SEND_CID,MMC_ARG_RCA(rca));
269281
if (!wait_and_get_response())
270282
returnfalse;
@@ -281,13 +293,15 @@ struct BCM2708SDHost : BlockDevice {
281293
returntrue;
282294
}
283295

296+
//#define DUMP_READ
297+
284298
boolwait_for_fifo_data(uint32_t timeout =100000) {
285299
uint32_t t = timeout;
286300

287301
while ((SH_HSTS & SH_HSTS_DATA_FLAG_SET) ==0) {
288302
if (t ==0) {
289303
putchar('\n');
290-
logf("ERROR: no FIFO data, timed out after %dus!\n", timeout);
304+
logf("ERROR: no FIFO data, timed out after %dus!\n", timeout)
291305
returnfalse;
292306
}
293307
t--;
@@ -298,6 +312,8 @@ struct BCM2708SDHost : BlockDevice {
298312
}
299313

300314
voiddrain_fifo() {
315+
/* fuck me with a rake ... gently*/
316+
301317
wait();
302318

303319
while (SH_HSTS & SH_HSTS_DATA_FLAG_SET) {
@@ -345,8 +361,9 @@ struct BCM2708SDHost : BlockDevice {
345361
/* drain useful data from FIFO*/
346362
for (i =0; i <128; i++) {
347363
/* wait for FIFO*/
348-
if (!wait_for_fifo_data())
364+
if (!wait_for_fifo_data()) {
349365
break;
366+
}
350367

351368
uint32_t hsts_err = SH_HSTS & SDHSTS_ERROR_MASK;
352369
if (hsts_err) {
@@ -388,7 +405,10 @@ struct BCM2708SDHost : BlockDevice {
388405
boolselect_card() {
389406
send(MMC_SELECT_CARD,MMC_ARG_RCA(rca));
390407

391-
returnwait();
408+
if (!wait())
409+
returnfalse;
410+
411+
returntrue;
392412
}
393413

394414
boolinit_card() {
@@ -480,6 +500,12 @@ struct BCM2708SDHost : BlockDevice {
480500
voidrestart_controller() {
481501
is_sdhc =false;
482502

503+
logf("hcfg 0x%X, cdiv 0x%X, edm 0x%X, hsts 0x%X\n",
504+
SH_HCFG,
505+
SH_CDIV,
506+
SH_EDM,
507+
SH_HSTS);
508+
483509
logf("Restarting the eMMC controller ...\n");
484510

485511
configure_pinmux();
@@ -495,10 +521,14 @@ struct BCM2708SDHost : BlockDevice {
495521
if (init_card()) {
496522
card_ready =true;
497523

498-
/* work around quirk / silicon bug*/
499-
for (int i =0; i <3; i++)
500-
if (!read_block(0,nullptr))
524+
/*
525+
* looks like a silicon bug to me or a quirk of csd2, who knows
526+
*/
527+
for (int i =0; i <3; i++) {
528+
if (!read_block(0,nullptr)) {
501529
panic("fifo flush cycle %d failed", i);
530+
}
531+
}
502532
}else {
503533
panic("failed to reinitialize the eMMC controller");
504534
}
@@ -547,4 +577,4 @@ BCM2708SDHost STATIC_DRIVER g_SDHostDriver {};
547577

548578
BlockDevice*get_sdhost_device() {
549579
return &g_SDHostDriver;
550-
}
580+
}

‎arm_chainloader/loader.cc

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ struct LoaderImpl {
7575
/* read device tree blob*/
7676
uint8_t* fdt =reinterpret_cast<uint8_t*>(DTB_LOAD_ADDRESS);
7777
size_t sz =read_file(filename, fdt,false);
78+
logf("FDT loaded at %X\n", (unsignedint) fdt);
7879

7980
void* v_fdt =reinterpret_cast<void*>(fdt);
8081

@@ -93,14 +94,20 @@ struct LoaderImpl {
9394

9495
res =fdt_setprop(v_fdt, node,"bootargs", cmdline,strlen((char*) cmdline) +1);
9596

96-
/* pass in a memory map (TODO: don't assume 256MB)*/
97+
/* pass in a memory map, skipping first meg for bootcode*/
9798
int memory =fdt_path_offset(v_fdt,"/memory");
9899
if(memory <0)
99100
panic("no memory node in fdt");
100101

102+
/* start the memory map at 1M/16 and grow continuous for 256M
103+
* TODO: does this disrupt I/O?*/
104+
105+
char dtype[] ="memory";
101106
uint8_t memmap[] = {0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x00 };
102107
res =fdt_setprop(v_fdt, memory,"reg", (void*) memmap,sizeof(memmap));
103108

109+
logf("(valid) fdt loaded at 0x%X\n", (unsignedint)fdt);
110+
104111
return fdt;
105112
}
106113

@@ -112,12 +119,17 @@ struct LoaderImpl {
112119

113120
LoaderImpl() {
114121
logf("Mounting boot partitiion ...\n");
115-
if(f_mount(&g_BootVolumeFs, ROOT_VOLUME_PREFIX,1) != FR_OK)
116-
panic("failed to mount boot partition");
122+
FRESULT r =f_mount(&g_BootVolumeFs, ROOT_VOLUME_PREFIX,1);
123+
if (r != FR_OK) {
124+
panic("failed to mount boot partition, error: %d", (int)r);
125+
}
126+
logf("Boot partition mounted!\n");
117127

118-
/* read the command-line*/
128+
/* read the command-linenull-terminated*/
119129
uint8_t* cmdline;
120-
read_file("cmdline.txt", cmdline);
130+
size_t cmdlen =read_file("cmdline.txt", cmdline);
131+
132+
logf("kernel cmdline: %s\n", cmdline);
121133

122134
/* load flat device tree*/
123135
uint8_t* fdt =load_fdt("rpi.dtb", cmdline);
@@ -130,8 +142,10 @@ struct LoaderImpl {
130142
linux_t kernel =reinterpret_cast<linux_t>(zImage);
131143

132144
size_t ksize =read_file("zImage", zImage,false);
145+
logf("zImage loaded at 0x%X\n", (unsignedint)kernel);
133146

134147
/* flush the cache*/
148+
logf("Flushing....\n")
135149
for (uint8_t* i = zImage; i < zImage + ksize; i +=32) {
136150
__asm____volatile__ ("mcr p15,0,%0,c7,c10,1" : :"r" (i) :"memory");
137151
}
@@ -140,7 +154,7 @@ struct LoaderImpl {
140154
teardown_hardware();
141155

142156
/* fire away -- this should never return*/
143-
logf("Jumping to the kernel...\n");
157+
logf("Jumping to theLinuxkernel...\n");
144158
kernel(0, ~0, fdt);
145159
}
146160
};

‎arm_chainloader/main.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,33 @@ static void heap_init() {
1616
init_memory_pool(hs,start_of_heap);
1717
}
1818

19+
staticconstchar*get_execution_mode_name() {
20+
uint32_tcpsr=arm_get_cpsr()&ARM32_MODE_MASK;
21+
22+
switch (cpsr) {
23+
caseARM32_USR:
24+
return"User";
25+
caseARM32_FIQ:
26+
return"FIQ";
27+
caseARM32_IRQ:
28+
return"IRQ";
29+
caseARM32_SVC:
30+
return"Supervisor";
31+
caseARM32_MON:
32+
return"Secure Monitor";
33+
caseARM32_ABT:
34+
return"Abort";
35+
caseARM32_UND:
36+
return"Undefined Instruction";
37+
caseARM32_HYP:
38+
return"Hypervisor";
39+
caseARM32_SYS:
40+
return"System";
41+
default:
42+
return"Unknown Mode";
43+
}
44+
}
45+
1946
voidmain(boolsecurity_supported) {
2047
/* wait for peripheral access */
2148
while(ARM_ID!=ARM_IDVAL);
@@ -31,6 +58,8 @@ void main(bool security_supported) {
3158
logf("Security extensions are supported!\n");
3259
}
3360

61+
logf("Execution mode: %s\n",get_execution_mode_name());
62+
3463
heap_init();
3564

3665
/* c++ runtime */

‎arm_chainloader/trap.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
#include<lib/runtime.h>
99

1010
structarm_saved_state {
11-
uint32_tr[13];/* General purpose register r0-r12*/
12-
uint32_tsp;/* Stack pointer r13*/
13-
uint32_tlr;/* Link register r14*/
14-
uint32_tpc;/* Program counter r15*/
15-
uint32_tcpsr;/* Current program status register*/
16-
uint32_tfsr;/* Fault status*/
17-
uint32_tfar;/* Virtual Fault Address*/
18-
uint32_texception;/* exception number*/
11+
uint32_tr[13];/* General purpose register r0-r12*/
12+
uint32_tsp;/* Stack pointer r13*/
13+
uint32_tlr;/* Link register r14*/
14+
uint32_tpc;/* Program counter r15*/
15+
uint32_tcpsr;/* Current program status register*/
16+
uint32_tfsr;/* Fault status*/
17+
uint32_tfar;/* Virtual Fault Address*/
18+
uint32_texception;/* exception number*/
1919
};
2020
typedefstructarm_saved_statearm_saved_state_t;
2121

@@ -68,4 +68,4 @@ extern "C" void sleh_irq(arm_saved_state_t* regs) {
6868

6969
extern"C"voidsleh_fiq(arm_saved_state_t* regs) {
7070
fatal_exception(regs,"FIQ");
71-
}
71+
}

‎drivers/BCM2708Gpio.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ void BCM2708Gpio::init() {
1313
setTag('GPIO');
1414
}
1515

16-
IODriverCreateSingletonInstance(BCM2708Gpio);
16+
IODriverCreateSingletonInstance(BCM2708Gpio);

‎romstage.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ int _main(unsigned int cpuid, unsigned int load_address) {
146146
"Booting Raspberry Pi....\n"
147147
"Copyright 2016-2017 rpi-open-firmware authors \n"
148148
"BUILDATE : %s %s \n",
149-
__DATE__,__TIME__
149+
__DATE__,__TIME__,
150150
);
151151

152152
g_CPUID=cpuid;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp