summaryrefslogtreecommitdiff
path: root/firmware/target/arm/rk27xx/rkw-loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/rk27xx/rkw-loader.c')
-rw-r--r--firmware/target/arm/rk27xx/rkw-loader.c72
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 */
29static 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
42const 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 */
55int load_rkw(unsigned char* buf, const char* filename, int buffer_size) 34int 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 }