TERES/SOFTWARE/A64-TERES/u-boot_new/board/sunxi/common/sunxi_serial.c
Dimitar Gamishev 093685c7d8 u-boot
2017-10-13 14:02:55 +03:00

83 lines
2.1 KiB
C

#include <common.h>
#include <sys_partition.h>
#include <fdt_support.h>
#include <sunxi_board.h>
#include <asm/io.h>
#include <smc.h>
int get_serial_num_from_file(char* serial)
{
int nodeoffset;
int ret = 0;
int partno = -1;
char *filename = NULL;
char part_info[16] = {0}; // format is "partno:0"
char addr_info[32] = {0}; //"00000000"
char file_info[64] = {0};
char * bmp_argv[6] = { "fatload", "sunxi_flash", part_info, addr_info, file_info, NULL };
//check serial_feature config info
nodeoffset = fdt_path_offset (working_fdt, "/soc/serial_feature");
if (nodeoffset < 0)
{
printf("sunxi_serial: serial_feature is not exist\n");
return -1;
}
ret = fdt_getprop_string(working_fdt,nodeoffset,"sn_filename",&filename);
if((ret < 0) || (strlen(filename)== 0) )
{
printf("sunxi_serial: sn_filename is not exist\n");
return -1;
}
//check private partition info
partno = sunxi_partition_get_partno_byname("private");
if(partno < 0)
{
return -1;
}
//get data from file
sprintf(part_info,"%d:0", partno);
sprintf(addr_info,"%lx", (ulong)serial);
sprintf(file_info,"%s", filename);
if(do_fat_fsload(0, 0, 5, bmp_argv))
{
printf("load file(%s) error \n", bmp_argv[4]);
return -1;
}
return 0;
}
int get_serial_num_from_chipid(char* serial)
{
u32 sunxi_soc_chipid[4];
u32 sunxi_serial[3];
sunxi_soc_chipid[0] = arm_svc_read_sec_reg(SUNXI_SID_BASE + 0x200);
sunxi_soc_chipid[1] = arm_svc_read_sec_reg(SUNXI_SID_BASE + 0x200 + 0x4);
sunxi_soc_chipid[2] = arm_svc_read_sec_reg(SUNXI_SID_BASE + 0x200 + 0x8);
sunxi_soc_chipid[3] = arm_svc_read_sec_reg(SUNXI_SID_BASE + 0x200 + 0xc);
sunxi_serial[0] = sunxi_soc_chipid[3];
sunxi_serial[1] = sunxi_soc_chipid[2];
sunxi_serial[2] = (sunxi_soc_chipid[1] >> 16) & 0xFFFF;
sprintf(serial , "%04x%08x%08x",sunxi_serial[2], sunxi_serial[1], sunxi_serial[0]);
return 0;
}
int sunxi_set_serial_num(void)
{
char serial[128] = {0};
if(get_serial_num_from_file(serial))
{
get_serial_num_from_chipid(serial);
}
printf("serial is: %s\n",serial);
if(setenv("sunxi_serial", serial))
{
printf("error:set variable [sunxi_serial] fail\n");
}
return 0;
}