diff options
author | Marcin Bukat <marcin.bukat@gmail.com> | 2012-03-04 15:34:29 +0100 |
---|---|---|
committer | Marcin Bukat <marcin.bukat@gmail.com> | 2013-06-27 13:50:11 +0200 |
commit | 0b29691324e5700f15ea653592bf29f8552d47d7 (patch) | |
tree | 00e4f77f28c813a493cd8af22170f486f6e82903 /firmware/target/arm/rk27xx/rkw-loader.c | |
parent | 46ea8bfe7c690c8db230fff3a582a69779f8e432 (diff) | |
download | rockbox-0b29691324e5700f15ea653592bf29f8552d47d7.tar.gz rockbox-0b29691324e5700f15ea653592bf29f8552d47d7.zip |
Move load_firmware() to separate file
The idea is to share loading code between bootloaders and rolo().
Change-Id: I1656ed91946d7a05cb7c9fa7a16793c3c862a5cd
Reviewed-on: http://gerrit.rockbox.org/190
Reviewed-by: Marcin Bukat <marcin.bukat@gmail.com>
Diffstat (limited to 'firmware/target/arm/rk27xx/rkw-loader.c')
-rw-r--r-- | firmware/target/arm/rk27xx/rkw-loader.c | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/firmware/target/arm/rk27xx/rkw-loader.c b/firmware/target/arm/rk27xx/rkw-loader.c index ed7e253f14..9b50e1b187 100644 --- a/firmware/target/arm/rk27xx/rkw-loader.c +++ b/firmware/target/arm/rk27xx/rkw-loader.c | |||
@@ -18,42 +18,22 @@ | |||
18 | * | 18 | * |
19 | ****************************************************************************/ | 19 | ****************************************************************************/ |
20 | 20 | ||
21 | #include <stdio.h> | ||
21 | #include "config.h" | 22 | #include "config.h" |
23 | #include "loader_strerror.h" | ||
22 | #include "rkw-loader.h" | 24 | #include "rkw-loader.h" |
23 | #include "crc32-rkw.h" | 25 | #include "crc32-rkw.h" |
24 | #include "file.h" | 26 | #include "file.h" |
25 | #include "panic.h" | 27 | #include "panic.h" |
26 | 28 | ||
27 | /* error strings sorted by number */ | ||
28 | /* error 0 is empty */ | ||
29 | static const char *err_str[] = { | ||
30 | "Loading OK", | ||
31 | "Can't open RKW file", | ||
32 | "Can't read RKW header", | ||
33 | "Invalid RKW magic number", | ||
34 | "RKW header CRC error", | ||
35 | "RKW file too big", | ||
36 | "RKW Load address mismatch", | ||
37 | "Bad model number", | ||
38 | "Error Reading File", | ||
39 | "RKW firmware CRC error" | ||
40 | }; | ||
41 | |||
42 | const char *rkw_strerror(int8_t errno) | ||
43 | { | ||
44 | if ((uint8_t)-errno >= sizeof(err_str)/sizeof(err_str[0]) || errno > 0) | ||
45 | return "Unknown error"; | ||
46 | |||
47 | return err_str[-errno]; | ||
48 | } | ||
49 | |||
50 | /* loosely based on load_firmware() | 29 | /* loosely based on load_firmware() |
51 | * on success we return size loaded image | 30 | * on success we return size of loaded image |
52 | * on error we return negative value which can be deciphered by means | 31 | * on error we return negative value which can be deciphered by means |
53 | * of rkw_strerror() function | 32 | * of rkw_strerror() function |
54 | */ | 33 | */ |
55 | int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | 34 | int load_rkw(unsigned char* buf, const char* firmware, int buffer_size) |
56 | { | 35 | { |
36 | char filename[MAX_PATH]; | ||
57 | int fd; | 37 | int fd; |
58 | int rc; | 38 | int rc; |
59 | int len; | 39 | int len; |
@@ -61,22 +41,42 @@ int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | |||
61 | uint32_t crc, fw_crc; | 41 | uint32_t crc, fw_crc; |
62 | struct rkw_header_t rkw_info; | 42 | struct rkw_header_t rkw_info; |
63 | 43 | ||
64 | fd = open(filename, O_RDONLY); | 44 | /* only filename passed */ |
45 | if (firmware[0] != '/') | ||
46 | { | ||
47 | /* First check in BOOTDIR */ | ||
48 | snprintf(filename, sizeof(filename), BOOTDIR "/%s",firmware); | ||
65 | 49 | ||
66 | if(fd < 0) | 50 | fd = open(filename, O_RDONLY); |
67 | return -1; | 51 | if(fd < 0) |
52 | { | ||
53 | /* Check in root dir */ | ||
54 | snprintf(filename, sizeof(filename),"/%s",firmware); | ||
55 | fd = open(filename, O_RDONLY); | ||
56 | |||
57 | if (fd < 0) | ||
58 | return EFILE_NOT_FOUND; | ||
59 | } | ||
60 | } | ||
61 | else | ||
62 | { | ||
63 | /* full path passed */ | ||
64 | fd = open(firmware, O_RDONLY); | ||
65 | if (fd < 0) | ||
66 | return EFILE_NOT_FOUND; | ||
67 | } | ||
68 | 68 | ||
69 | rc = read(fd, &rkw_info, sizeof(rkw_info)); | 69 | rc = read(fd, &rkw_info, sizeof(rkw_info)); |
70 | if (rc < (int)sizeof(rkw_info)) | 70 | if (rc < (int)sizeof(rkw_info)) |
71 | { | 71 | { |
72 | ret = -2; | 72 | ret = EREAD_HEADER_FAILED; |
73 | goto end; | 73 | goto end; |
74 | } | 74 | } |
75 | 75 | ||
76 | /* check if RKW is valid */ | 76 | /* check if RKW is valid */ |
77 | if (rkw_info.magic_number != RKLD_MAGIC) | 77 | if (rkw_info.magic_number != RKLD_MAGIC) |
78 | { | 78 | { |
79 | ret = -3; | 79 | ret = EINVALID_FORMAT; |
80 | goto end; | 80 | goto end; |
81 | } | 81 | } |
82 | 82 | ||
@@ -86,7 +86,7 @@ int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | |||
86 | crc = crc32_rkw((uint8_t *)&rkw_info, sizeof(rkw_info)-sizeof(uint32_t)); | 86 | crc = crc32_rkw((uint8_t *)&rkw_info, sizeof(rkw_info)-sizeof(uint32_t)); |
87 | if (rkw_info.crc != crc) | 87 | if (rkw_info.crc != crc) |
88 | { | 88 | { |
89 | ret = -4; | 89 | ret = EBAD_HEADER_CHKSUM; |
90 | goto end; | 90 | goto end; |
91 | } | 91 | } |
92 | } | 92 | } |
@@ -95,14 +95,14 @@ int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | |||
95 | len = rkw_info.load_limit - rkw_info.load_address; | 95 | len = rkw_info.load_limit - rkw_info.load_address; |
96 | if (len > buffer_size) | 96 | if (len > buffer_size) |
97 | { | 97 | { |
98 | ret = -5; | 98 | ret = EFILE_TOO_BIG; |
99 | goto end; | 99 | goto end; |
100 | } | 100 | } |
101 | 101 | ||
102 | /* check load address - we support loading only at 0x60000000 */ | 102 | /* check load address - we support loading only at 0x60000000 */ |
103 | if (rkw_info.load_address != 0x60000000) | 103 | if (rkw_info.load_address != 0x60000000) |
104 | { | 104 | { |
105 | ret = -6; | 105 | ret = EINVALID_LOAD_ADDR; |
106 | goto end; | 106 | goto end; |
107 | } | 107 | } |
108 | 108 | ||
@@ -112,7 +112,7 @@ int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | |||
112 | */ | 112 | */ |
113 | if (rkw_info.reserved0 != 0 && rkw_info.reserved0 != MODEL_NUMBER) | 113 | if (rkw_info.reserved0 != 0 && rkw_info.reserved0 != MODEL_NUMBER) |
114 | { | 114 | { |
115 | ret = -7; | 115 | ret = EBAD_MODEL; |
116 | goto end; | 116 | goto end; |
117 | } | 117 | } |
118 | 118 | ||
@@ -124,7 +124,7 @@ int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | |||
124 | 124 | ||
125 | if(rc < len) | 125 | if(rc < len) |
126 | { | 126 | { |
127 | ret = -8; | 127 | ret = EREAD_IMAGE_FAILED; |
128 | goto end; | 128 | goto end; |
129 | } | 129 | } |
130 | 130 | ||
@@ -136,7 +136,7 @@ int load_rkw(unsigned char* buf, const char* filename, int buffer_size) | |||
136 | 136 | ||
137 | if (fw_crc != crc) | 137 | if (fw_crc != crc) |
138 | { | 138 | { |
139 | ret = -9; | 139 | ret = EBAD_CHKSUM; |
140 | goto end; | 140 | goto end; |
141 | } | 141 | } |
142 | } | 142 | } |