mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
ipq806x: fix linksys E8350 factory header
This commit is contained in:
parent
b4e219dc4b
commit
cda8c08d33
@ -24,5 +24,5 @@ boot() {
|
|||||||
echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
|
echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
|
||||||
|
|
||||||
sysctl -w vm.min_free_kbytes=65536
|
sysctl -w vm.min_free_kbytes=65536
|
||||||
sysctl -w net.netfilter.nf_conntrack_max=32768
|
sysctl -w net.netfilter.nf_conntrack_max=65535
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ define Build/linksys-bin
|
|||||||
endef
|
endef
|
||||||
# Use Linksys fw header generator to upgrade openwrt factory image over the native Linksys WEB interface
|
# Use Linksys fw header generator to upgrade openwrt factory image over the native Linksys WEB interface
|
||||||
define Build/linksys-addfwhdr
|
define Build/linksys-addfwhdr
|
||||||
-$(STAGING_DIR_HOST)/bin/linksys/addfwhdr -i $@ -o $@.new \
|
-$(STAGING_DIR_HOST)/bin/addfwhdr -i $@ -o $@.new \
|
||||||
;mv "$@.new" "$@"
|
;mv "$@.new" "$@"
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ endef
|
|||||||
define Host/Compile
|
define Host/Compile
|
||||||
mkdir -p $(HOST_BUILD_DIR)/bin
|
mkdir -p $(HOST_BUILD_DIR)/bin
|
||||||
$(call cc,add_header,-Wall)
|
$(call cc,add_header,-Wall)
|
||||||
|
$(call cc,addfwhdr cyg_crc32,-Wall)
|
||||||
$(call cc,addpattern,-Wall)
|
$(call cc,addpattern,-Wall)
|
||||||
$(call cc,asustrx,-Wall)
|
$(call cc,asustrx,-Wall)
|
||||||
$(call cc,bcm4908asus,-Wall)
|
$(call cc,bcm4908asus,-Wall)
|
||||||
|
233
tools/firmware-utils/src/addfwhdr.c
Normal file
233
tools/firmware-utils/src/addfwhdr.c
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
/*
|
||||||
|
Linksys e8350 v1 firmware header generator
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "cyg_crc.h"
|
||||||
|
#define AC2350 20
|
||||||
|
#define USA 1
|
||||||
|
|
||||||
|
#if LOCALE == USA
|
||||||
|
#define CYBERTAN_VERSION "v1.0.03"
|
||||||
|
#define SERIAL_NUMBER "003"
|
||||||
|
#define MINOR_VERSION ""
|
||||||
|
#define BUILD_KEYWORD " B"
|
||||||
|
#define BUILD_NUMBER SERIAL_NUMBER
|
||||||
|
#define BETA_VERSION " "
|
||||||
|
#define CYBERTAN_UBOOT_VERSION "v1.0"
|
||||||
|
#else // ETSI
|
||||||
|
#define CYBERTAN_VERSION "v1.0.00"
|
||||||
|
#define SERIAL_NUMBER "01"
|
||||||
|
#define MINOR_VERSION ""
|
||||||
|
#define BUILD_KEYWORD " B"
|
||||||
|
#define BUILD_NUMBER SERIAL_NUMBER
|
||||||
|
#define BETA_VERSION " "
|
||||||
|
#define CYBERTAN_UBOOT_VERSION "v1.0"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//add for AC2350 F/W header
|
||||||
|
#define FWHDR_MAGIC_STR "CHDR"
|
||||||
|
#define FWHDR_MAGIC 0X52444843
|
||||||
|
struct cbt_fw_header
|
||||||
|
{
|
||||||
|
unsigned int magic; /* "CHDR" */
|
||||||
|
unsigned int len; /* Length of file including header */
|
||||||
|
unsigned int crc32; /* 32-bit CRC */
|
||||||
|
unsigned int res;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAX_BUF 1024
|
||||||
|
#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */
|
||||||
|
|
||||||
|
#ifndef TYPEDEF_UINT8
|
||||||
|
typedef unsigned char uint8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TYPEDEF_UINT16
|
||||||
|
typedef unsigned short uint16;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TYPEDEF_UINT32
|
||||||
|
typedef unsigned int uint32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef uint32_t cyg_uint32;
|
||||||
|
typedef uint16_t cyg_uint16;
|
||||||
|
|
||||||
|
extern cyg_uint32 cyg_crc32_accumulate(cyg_uint32 crc32val, unsigned char *s, int len);
|
||||||
|
//extern uint32 crc32(uint8 *pdata, uint nbytes, uint32 crc);
|
||||||
|
|
||||||
|
int fd, fd_w;
|
||||||
|
|
||||||
|
void die(const char * str, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, str);
|
||||||
|
vfprintf(stderr, str, args);
|
||||||
|
fputc('\n', stderr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fill_null0(int size)
|
||||||
|
{
|
||||||
|
unsigned char buf[1];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fprintf(stderr,"Fill null\n");
|
||||||
|
|
||||||
|
buf[0] = 0xff;
|
||||||
|
for (i=0 ; i< size; i++ )
|
||||||
|
if (write(fd_w, buf, 1) != 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
long file_open(const char *name)
|
||||||
|
{
|
||||||
|
struct stat sb;
|
||||||
|
if ((fd = open(name, O_RDONLY, 0)) < 0){
|
||||||
|
die("Unable to open `%s' : %m", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fstat (fd, &sb))
|
||||||
|
die("Unable to stat `%s' : %m", name);
|
||||||
|
|
||||||
|
return sb.st_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usage(void)
|
||||||
|
{
|
||||||
|
die("Usage: addfwhdr [-i|--input] sysupgrade.o [-o|--output] code.bin\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char ** argv)
|
||||||
|
{
|
||||||
|
uint input_size,c;
|
||||||
|
char *input_file=NULL, *output_file=NULL;
|
||||||
|
int opt;
|
||||||
|
int option_index=0;
|
||||||
|
int garbage = 0;
|
||||||
|
char *buf = NULL;
|
||||||
|
extern char *optarg;
|
||||||
|
extern int optind, opterr, optopt;
|
||||||
|
|
||||||
|
struct cbt_fw_header *fwhdr;
|
||||||
|
uint32 crc;
|
||||||
|
|
||||||
|
static struct option long_options[] =
|
||||||
|
{
|
||||||
|
{"input", 1, 0, 'i'},
|
||||||
|
{"output", 1, 0, 'o'},
|
||||||
|
{"garbage", 0, 0, 'g'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
printf("\n---------- add fw header --------\n");
|
||||||
|
|
||||||
|
fwhdr = malloc(sizeof(struct cbt_fw_header));
|
||||||
|
memset(fwhdr, 0, sizeof(struct cbt_fw_header));
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
opt = getopt_long(argc, argv, "i:o:g",long_options, &option_index);
|
||||||
|
if(opt == -1)
|
||||||
|
break;
|
||||||
|
switch(opt){
|
||||||
|
case 'h' :
|
||||||
|
usage(); break;
|
||||||
|
case 'i' :
|
||||||
|
input_file = optarg;
|
||||||
|
printf("input file is [%s]\n",input_file); break;
|
||||||
|
case 'o' :
|
||||||
|
output_file = optarg;
|
||||||
|
printf("output file is [%s]\n",output_file); break;
|
||||||
|
case 'g' :
|
||||||
|
garbage = 1; break;
|
||||||
|
default :
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!input_file || !output_file)
|
||||||
|
{
|
||||||
|
printf("You must specify the input and output file!\n");
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unlink(output_file);
|
||||||
|
if ((fd_w = open(output_file,O_RDWR|O_CREAT, S_IREAD | S_IWRITE)) < 0){
|
||||||
|
die("Unable to open `%s' : %m", output_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
fwhdr = malloc(sizeof(struct cbt_fw_header));
|
||||||
|
memset(fwhdr, 0, sizeof(struct cbt_fw_header));
|
||||||
|
|
||||||
|
memcpy((char *)&fwhdr->magic, FWHDR_MAGIC_STR, sizeof(fwhdr->magic));
|
||||||
|
|
||||||
|
input_size = file_open(input_file);
|
||||||
|
if(!(buf = malloc(input_size)))
|
||||||
|
{
|
||||||
|
perror("malloc");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
c = read(fd, buf, input_size);
|
||||||
|
fwhdr->len = input_size + sizeof(struct cbt_fw_header);
|
||||||
|
|
||||||
|
fwhdr->res = fwhdr->res | 0x1;
|
||||||
|
|
||||||
|
//junzhao add fw build date in cbt_fw_header for calculate MD5
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
static char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||||
|
int year, day, mon=1;
|
||||||
|
char temp[10]={0};
|
||||||
|
unsigned char *p_date = (unsigned char *)&fwhdr->res;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
sscanf(__DATE__, "%s %d %d", temp, &day, &year);
|
||||||
|
|
||||||
|
for(j=0;j<12;j++) {
|
||||||
|
if(!strcmp(temp, months[j])) {
|
||||||
|
mon = j+1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p_date[0]= year-2000;
|
||||||
|
p_date[1]= mon;
|
||||||
|
p_date[2]= day;
|
||||||
|
|
||||||
|
printf("%s: Build date(20%d-%d-%d)\n", __FUNCTION__, p_date[0], p_date[1], p_date[2]);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//end
|
||||||
|
|
||||||
|
crc = cyg_crc32_accumulate(CRC32_INIT_VALUE,(uint8 *)&fwhdr->res, 4);
|
||||||
|
crc = cyg_crc32_accumulate(crc,(uint8 *)&buf[0], input_size);
|
||||||
|
|
||||||
|
fwhdr->crc32 = crc;
|
||||||
|
|
||||||
|
/* write code pattern header */
|
||||||
|
write(fd_w, fwhdr, sizeof(struct cbt_fw_header));
|
||||||
|
|
||||||
|
if(write(fd_w, buf, c)!=c)
|
||||||
|
die("Write call failed!\n");
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if(buf)
|
||||||
|
free(buf);
|
||||||
|
close (fd);
|
||||||
|
close (fd_w);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user