mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "gpt.h"
 | |
| 
 | |
| #include "sdcDriver.h"
 | |
| 
 | |
| #include "uart.h"
 | |
| #include <stddef.h>
 | |
| 
 | |
| int gpt_find_boot_partition(long int* dest, uint32_t size)
 | |
| {
 | |
|   //int ret = init_sd();
 | |
|   int ret;
 | |
|   setSDCCLK(4); // must be even, 1 gives no division.
 | |
|   waitInitSDC();
 | |
|   ret = 0;
 | |
|     if (ret != 0) {
 | |
|         print_uart("could not initialize sd... exiting\r\n");
 | |
|         return -1;
 | |
|     }
 | |
| 
 | |
|     print_uart("sd initialized!\r\n");
 | |
| 
 | |
|     // load LBA1
 | |
|     size_t block_size = 512/8;
 | |
|     long int lba1_buf[block_size];
 | |
| 
 | |
|     //int res = sd_copy(lba1_buf, 1, 1);
 | |
|     int res;
 | |
|     copySDC512(1, lba1_buf);
 | |
|     res = 0;
 | |
| 
 | |
|     if (res != 0)
 | |
|     {
 | |
|         print_uart("SD card failed!\r\n");
 | |
|         print_uart("sd copy return value: ");
 | |
|         print_uart_addr(res);
 | |
|         print_uart("\r\n");
 | |
|         return -2;
 | |
|     }
 | |
| 
 | |
|     gpt_pth_t *lba1 = (gpt_pth_t *)lba1_buf;
 | |
| 
 | |
|     print_uart("gpt partition table header:");
 | |
|     print_uart("\r\n\tsignature:\t");
 | |
|     print_uart_addr(lba1->signature);
 | |
|     print_uart("\r\n\trevision:\t");
 | |
|     print_uart_int(lba1->revision);
 | |
|     print_uart("\r\n\tsize:\t\t");
 | |
|     print_uart_int(lba1->header_size);
 | |
|     print_uart("\r\n\tcrc_header:\t");
 | |
|     print_uart_int(lba1->crc_header);
 | |
|     print_uart("\r\n\treserved:\t");
 | |
|     print_uart_int(lba1->reserved);
 | |
|     print_uart("\r\n\tcurrent lba:\t");
 | |
|     print_uart_addr(lba1->current_lba);
 | |
|     print_uart("\r\n\tbackup lda:\t");
 | |
|     print_uart_addr(lba1->backup_lba);
 | |
|     print_uart("\r\n\tpartition entries lba:   \t");
 | |
|     print_uart_addr(lba1->partition_entries_lba);
 | |
|     print_uart("\r\n\tnumber partition entries:\t");
 | |
|     print_uart_int(lba1->nr_partition_entries);
 | |
|     print_uart("\r\n\tsize partition entries:  \t");
 | |
|     print_uart_int(lba1->size_partition_entry);
 | |
|     print_uart("\r\n");
 | |
| 
 | |
|     long int lba2_buf[block_size];
 | |
| 
 | |
|     //res = sd_copy(lba2_buf, lba1->partition_entries_lba, 1);
 | |
|     copySDC512(lba1->partition_entries_lba, lba2_buf);
 | |
|     res = 0;
 | |
| 
 | |
|     if (res != 0)
 | |
|     {
 | |
|         print_uart("SD card failed!\r\n");
 | |
|         print_uart("sd copy return value: ");
 | |
|         print_uart_addr(res);
 | |
|         print_uart("\r\n");
 | |
|         return -2;
 | |
|     }
 | |
| 
 | |
|     for (int i = 0; i < 4; i++)
 | |
|     {
 | |
|         partition_entries_t *part_entry = (partition_entries_t *)(lba2_buf + (i * 128));
 | |
|         print_uart("gpt partition entry ");
 | |
|         print_uart_byte(i);
 | |
|         print_uart("\r\n\tpartition type guid:\t");
 | |
|         for (int j = 0; j < 16; j++)
 | |
|             print_uart_byte(part_entry->partition_type_guid[j]);
 | |
|         print_uart("\r\n\tpartition guid:     \t");
 | |
|         for (int j = 0; j < 16; j++)
 | |
|             print_uart_byte(part_entry->partition_guid[j]);
 | |
|         print_uart("\r\n\tfirst lba:\t");
 | |
|         print_uart_addr(part_entry->first_lba);
 | |
|         print_uart("\r\n\tlast lba:\t");
 | |
|         print_uart_addr(part_entry->last_lba);
 | |
|         print_uart("\r\n\tattributes:\t");
 | |
|         print_uart_addr(part_entry->attributes);
 | |
|         print_uart("\r\n\tname:\t");
 | |
|         for (int j = 0; j < 72; j++)
 | |
|             print_uart_byte(part_entry->name[j]);
 | |
|         print_uart("\r\n");
 | |
|     }
 | |
| 
 | |
|     partition_entries_t *boot = (partition_entries_t *)(lba2_buf);
 | |
|     print_uart("copying boot image ");
 | |
|     //res = sd_copy(dest, boot->first_lba, boot->last_lba - boot->first_lba + 1);
 | |
|     copyFlash(boot->first_lba, dest, boot->last_lba - boot->first_lba + 1);
 | |
| 
 | |
|     if (res != 0)
 | |
|     {
 | |
|         print_uart("SD card failed!\r\n");
 | |
|         print_uart("sd copy return value: ");
 | |
|         print_uart_addr(res);
 | |
|         print_uart("\r\n");
 | |
|         return -2;
 | |
|     }
 | |
| 
 | |
|     print_uart(" done!\r\n");
 | |
|     return 0;
 | |
| }
 |