#include <string.h>
|
#include <stdlib.h>
|
#include <unistd.h>
|
#include <termio.h>
|
#include <stdio.h>
|
#include <sys/ioctl.h>
|
#include <sys/time.h>
|
#include <ctype.h>
|
#include <errno.h>
|
#include <fcntl.h>
|
//#include <cutils/properties.h>
|
#include <sys/utsname.h>
|
//#include <cutils/list.h>
|
//#include <cutils/log.h>
|
//#include <cutils/sockets.h>
|
#include <sys/reboot.h>
|
//#include <cutils/iosched_policy.h>
|
|
#undef LOG_TAG
|
#define LOG_TAG "LcdParamService"
|
|
typedef unsigned short uint16;
|
typedef unsigned long uint32;
|
typedef unsigned char uint8;
|
|
|
#define LCD_PARAMETE_FILE_UPATH "find /media/demo/usb0 -name nodka_lcd"
|
#define LCD_PARAMETE_FILE_SDPATH "find /nodka_test -name nodka_lcd"
|
//#define OEM_PARTITIOM_NODE_PATH "/dev/block/by-name/lcdparam"
|
//#define BASEPARAMETER_PATH "dev/block/platform/fe330000.sdhci/by-name/baseparameter"
|
#define BASEPARAMETER_PATH "/dev/block/by-name/baseparameter"
|
/*#define OEM_PARTITIOM_NODE_PATH "data/oem"*/
|
|
/*#define RKNAND_GET_VENDOR_SECTOR0 _IOW('v', 16, unsigned int)*/
|
/*#define RKNAND_STORE_VENDOR_SECTOR0 _IOW('v', 17, unsigned int)*/
|
|
|
#define RKNAND_SYS_STORGAE_DATA_LEN 512 //oem size
|
/*#define VENDOR_SECTOR_OP_TAG 0x444E4556 // "VEND"*/
|
|
#define POLY 0xEDB88320L //CRC stand
|
#define CONFIG_NUM 27
|
#define BASE_OFFSET 256 * 1024
|
|
char *key[CONFIG_NUM] =
|
{
|
"panel-type",
|
|
"unprepare-delay-ms",
|
"enable-delay-ms",
|
"disable-delay-ms",
|
"prepare-delay-ms",
|
"reset-delay-ms",
|
"init-delay-ms",
|
"width-mm",
|
"height-mm",
|
|
"clock-frequency",
|
"hactive",
|
"hfront-porch",
|
"hsync-len",
|
"hback-porch",
|
"vactive",
|
"vfront-porch",
|
"vsync-len",
|
"vback-porch",
|
"hsync-active",
|
"vsync-active",
|
"de-active",
|
"pixelclk-active",
|
|
"dsi,flags",
|
"dsi,format",
|
"dsi,lanes",
|
"panel-init-sequence",
|
|
"nodka_lvds"
|
};
|
|
typedef struct tagRKNAND_SYS_STORGAE
|
{
|
/*unsigned long tag;*/
|
/*unsigned long len;*/
|
unsigned char data[RKNAND_SYS_STORGAE_DATA_LEN];
|
}RKNAND_SYS_STORGAE;
|
|
|
static uint32 crc32_tab[256];
|
static uint32 nand_crc = 0;
|
|
char *strreplace(char *s, char old, char new)
|
{
|
for (; *s; ++s)
|
if (*s == old)
|
*s = new;
|
return s;
|
}
|
|
void rknand_print_hex_data(uint8 *s,uint32 * buf,uint32 len)
|
{
|
uint32 i;
|
printf("%s\n",s);
|
for(i=0;i<len;i+=4)
|
{
|
printf("%lx %lx %lx %lx\n",buf[i],buf[i+1],buf[i+2],buf[i+3]);
|
}
|
}
|
|
|
void init_crc32_tab(void)
|
{
|
int i = 0;
|
int j = 0;
|
uint32 crc = 0;
|
|
for(i = 0; i < 256; i++)
|
{
|
crc = (uint32)i;
|
for(j = 0; j < 8; j++)
|
{
|
if(crc & 0x00000001L)
|
crc = (crc >> 1) ^ POLY;
|
else
|
crc = crc >> 1;
|
}
|
crc32_tab[i] = crc;
|
}
|
|
}
|
|
uint32 get_crc32(uint32 crc_init, uint8 *crc_buf, uint32 buf_size)
|
{
|
uint32 crc = crc_init ^ 0xffffffff;
|
|
init_crc32_tab();
|
while(buf_size--)
|
crc = (crc >> 8) ^ crc32_tab[(crc & 0xff) ^ *crc_buf++];
|
return crc ^ 0xfffffff;
|
}
|
|
uint32 getfile_crc(FILE *fp)
|
{
|
uint32 size = 4 *1024;
|
uint8 crc_buf[size];
|
uint32 readln = 0;
|
uint crc = 0;
|
|
while((readln = fread(crc_buf, sizeof(uint8), size, fp)) > 0)
|
crc = get_crc32(crc, crc_buf, readln);
|
|
return crc;
|
|
}
|
|
/*
|
*去除字符串左端空格
|
*/
|
char *strtriml(char *pstr)
|
{
|
int i = 0,j;
|
j = strlen(pstr) - 1;
|
while (isspace(pstr[i]) && (i <= j))
|
i++;
|
if (0<i)
|
strcpy(pstr, &pstr[i]);
|
return pstr;
|
}
|
|
/*
|
*去除字符串右端空格
|
*/
|
char *strtrimr(char *pstr)
|
{
|
int i;
|
i = strlen(pstr) - 1;
|
while (isspace(pstr[i]) && (i >= 0))
|
pstr[i--] = '\0';
|
return pstr;
|
}
|
|
/*
|
*去除字符串两端空格
|
*/
|
char *strtrim(char *pstr)
|
{
|
char *p;
|
p = strtrimr(pstr);
|
return strtriml(p);
|
}
|
|
|
char *strdelchr(char *pstr, int chr)
|
{
|
int i = 0;
|
int l = 0;
|
int ll = 0;
|
ll = l = strlen(pstr);
|
|
while(i < l)
|
{
|
if(pstr[i] == chr)
|
{
|
memmove((pstr + i), (pstr + i + 1), (ll - i -1));
|
pstr[ll - 1] = '\0';
|
ll--;
|
}
|
i++;
|
}
|
/* for(i = 0; i < l; i++) */
|
/* { */
|
/* if(pstr[i] == chr) */
|
/* { */
|
/* memmove((pstr + i), (pstr + i + 1), (l - i -1)); */
|
/* pstr[l - 1] = '\0'; */
|
/* break; */
|
/* } */
|
/* } */
|
return pstr;
|
}
|
|
|
void strrmspace(char * str)
|
{
|
char *p1, *p2;
|
char ch;
|
p1 = str; //first pointer
|
p2 = str; // second pointer to the remaining string
|
if (p1==NULL) return;
|
while (*p1)
|
{
|
if (*p1 != ' ')
|
{
|
ch = *p1;
|
*p2 = ch;
|
p1++;
|
p2++;
|
}
|
else
|
{
|
p1++;
|
}
|
}
|
*p2 = '\0';
|
}
|
uint32 getfile_crc_from_nand(void)
|
{
|
int ret = 0;
|
uint32 crc = 0;
|
|
RKNAND_SYS_STORGAE sysData;
|
|
int sys_fd;
|
|
if (0 != access(BASEPARAMETER_PATH, R_OK | W_OK)){
|
printf("access fail!!!\n");
|
return -1;
|
}
|
|
memset(sysData.data, '\0', sizeof(sysData.data));
|
/*sysData.tag = VENDOR_SECTOR_OP_TAG;*/
|
/*sysData.len = RKNAND_SYS_STORGAE_DATA_LEN-8;*/
|
/*sys_fd = fopen(OEM_PARTITIOM_NODE_PATH, "r");*/
|
/*[>sys_fd = open("/dev/rknand_sys_storage",O_RDWR,0);<]*/
|
/*if(sys_fd == NULL)*/
|
/*{*/
|
/*printf("fopen err %s err=%d\n",OEM_PARTITIOM_NODE_PATH, sys_fd);*/
|
/*return -1;*/
|
/*}*/
|
|
sys_fd = open(BASEPARAMETER_PATH, O_RDONLY);
|
|
if (sys_fd < 0)
|
{
|
printf("fopen err %s sys_fd=,%d\n",BASEPARAMETER_PATH, sys_fd);
|
return -1;
|
}
|
lseek(sys_fd, BASE_OFFSET, SEEK_SET);
|
ret = read (sys_fd, (void*)&sysData, sizeof(sysData));
|
if (ret < 0)
|
{
|
printf("read err %s sys_fd=,%d\n",BASEPARAMETER_PATH, sys_fd );
|
return -1;
|
}
|
|
/*ret = ioctl(sys_fd, RKNAND_GET_VENDOR_SECTOR0, &sysData);*/
|
/*fread((void*)&sysData,sizeof(sysData),1,sys_fd);*/
|
/* rknand_print_hex_data("getfile_crc_from_nand data:",(uint32*)sysData.data,32); */
|
/* crc = sysData.data[24 * 4]; */
|
/* crc = (crc << 8) + sysData.data[24 * 4 + 1]; */
|
/* crc = (crc << 8) + sysData.data[24 * 4 + 2]; */
|
/* crc = (crc << 8) + sysData.data[24 * 4 + 3]; */
|
/* printf("-luoxt- crc data = 0x%02x%02x%02x%02x", sysData.data[24 * 4], */
|
/* sysData.data[24 * 4 + 1], */
|
/* sysData.data[24 * 4 + 2], */
|
/* sysData.data[24 * 4 + 3]); */
|
|
for(int i = 0; i < CONFIG_NUM+1; i++){
|
crc = sysData.data[i * 4];
|
crc = (crc << 8) + sysData.data[i * 4 + 1];
|
crc = (crc << 8) + sysData.data[i * 4 + 2];
|
crc = (crc << 8) + sysData.data[i * 4 + 3];
|
printf("-luoxt- %d nand crc data = 0X%02X%02X%02X%02X\n", i, sysData.data[i * 4],
|
sysData.data[i * 4 + 1],
|
sysData.data[i * 4 + 2],
|
sysData.data[i * 4 + 3]);
|
}
|
|
|
crc = sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-4];
|
crc = (crc << 8) + sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-3];
|
crc = (crc << 8) + sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-2];
|
crc = (crc << 8) + sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-1];
|
printf("-luoxt- nand crc data = 0X%02X%02X%02X%02X\n", sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-4],
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-3],
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-2],
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-1]);
|
close(sys_fd);
|
|
return crc;
|
}
|
|
int rk_update_lcd_parameters_from_sdcard(void)
|
{
|
|
int ret = 0;
|
FILE *fp = 0;
|
char line[1024] = {0};
|
int i = 0;
|
RKNAND_SYS_STORGAE sysData;
|
int sys_fd = 0;
|
static uint32 file_crc = 0; //file lcdparameter crc data
|
static int updated = 0; // had store the param into the nand
|
static char got_crc = 0; //get file crc flag
|
char lcdparameter_buf[128];
|
FILE *stream;
|
|
memset( lcdparameter_buf, '\0', sizeof(lcdparameter_buf) );
|
memset(sysData.data, '\0', sizeof(sysData.data));
|
if((access(LCD_PARAMETE_FILE_UPATH,F_OK))!=-1)
|
{
|
printf("update form udisk\n");
|
stream = popen(LCD_PARAMETE_FILE_UPATH, "r");
|
}
|
else
|
{
|
printf("update form emmc\n");
|
stream = popen(LCD_PARAMETE_FILE_SDPATH, "r");
|
}
|
fread( lcdparameter_buf, sizeof(char), sizeof(lcdparameter_buf), stream);
|
strreplace(lcdparameter_buf,'\n','\0');
|
pclose(stream);
|
|
/*
|
while(access(lcdparameter_buf, 0))
|
{
|
if(updated)
|
updated = 0;
|
if(got_crc)
|
got_crc = 0;
|
return -1;
|
}
|
*/
|
|
if(!updated)
|
{
|
if (!got_crc)
|
{
|
fp = fopen(lcdparameter_buf, "r");
|
//fp = fopen("/root/rk_lcd_parameters", "rb");
|
printf("---XYP_DEBUG--- ======== %s %d ========\n", __func__, __LINE__);
|
if(fp == NULL)
|
{
|
printf("open %s failed\n", lcdparameter_buf);
|
return -1;
|
}
|
else
|
{
|
printf("success open file %s \n", lcdparameter_buf);
|
}
|
|
file_crc = getfile_crc(fp);
|
got_crc = 1;
|
printf(" file crc is 0X%08lX nand_crc is 0X%08lX \n", file_crc, nand_crc );
|
fclose(fp);
|
}
|
|
/*sysData.tag = VENDOR_SECTOR_OP_TAG;*/
|
/*sysData.len = RKNAND_SYS_STORGAE_DATA_LEN - 8;*/
|
|
if((nand_crc != file_crc))
|
{
|
fp = fopen(lcdparameter_buf, "r");
|
if(fp == NULL)
|
{
|
printf("open %s failed\n", lcdparameter_buf);
|
return -1;
|
}
|
else
|
{
|
printf("success open file %s\n", lcdparameter_buf);
|
}
|
|
|
while(fgets(line, 1023, fp))
|
{
|
char *p = strtrim(line);
|
int len = strlen(p);
|
if(len <= 0)
|
{
|
continue;
|
}
|
else if(p[0]=='#')
|
{
|
continue;
|
}
|
else if( (!(strstr(p, "="))) && (!(strstr(p, ";"))) && (!(strstr(p, "screen_"))))
|
{
|
continue;
|
}
|
else
|
{
|
// get key and value string like "screen_lvds_format = 1" spilt by ";"
|
char *key_val_str = strtok(p, ";");
|
char *value = strchr(key_val_str, '=');
|
char cmd[4] = {'\0'};
|
if(value == NULL)
|
continue;
|
for(i = 0; i < CONFIG_NUM; i++)
|
{
|
if(strstr(p, key[i]))
|
{
|
char *val = strdelchr(value, '=');
|
strrmspace(val);
|
uint32 config1 = atoi(val);
|
|
if (strstr(p, "panel-init-sequence"))
|
{
|
int count=0;
|
int cmdlen=strlen(val)/2;
|
|
sysData.data[i * 4] =(uint8) (cmdlen >> 24);
|
sysData.data[i * 4 + 1] =(uint8) (cmdlen >> 16);
|
sysData.data[i * 4 + 2] =(uint8) (cmdlen >> 8);
|
sysData.data[i * 4 + 3] =(uint8) (cmdlen >> 0);
|
printf("-luoxt- %s=%lu val %s\n", key[i], config1, val);
|
i ++;
|
while(1)
|
{
|
cmd [0] = '0';
|
cmd [1] = 'x';
|
cmd [2] = *val;
|
cmd [3] = *(++val);
|
uint8 cmdu8 = strtol(cmd,NULL,16);
|
sysData.data[i * 4 + count++] = cmdu8;
|
|
printf("v1-luoxt- cmd=%d count=%d total=%d\n", cmdu8, count, cmdlen);
|
if (count < cmdlen)
|
++val; //next cmd
|
else
|
break;
|
}
|
|
}
|
else{
|
sysData.data[i * 4] =(uint8) (config1 >> 24);
|
sysData.data[i * 4 + 1] =(uint8) (config1 >> 16);
|
sysData.data[i * 4 + 2] =(uint8) (config1 >> 8);
|
sysData.data[i * 4 + 3] =(uint8) (config1 >> 0);
|
printf("-luoxt- %s=%lu val %s\n", key[i], config1, val);
|
}
|
break;
|
}
|
}
|
|
}
|
|
}
|
// file crc data
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-4] = (uint8) (file_crc >> 24);
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-3] = (uint8) (file_crc >> 16);
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-2] = (uint8) (file_crc >> 8);
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-1] = (uint8) (file_crc >> 0);
|
printf("-luoxt- crc32 = 0X%02X%02X%02X%02X\n", sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-4],
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-3],
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-2],
|
sysData.data[RKNAND_SYS_STORGAE_DATA_LEN-1]);
|
|
/* rknand_print_hex_data("lcd paramters save:",(uint32*)sysData.data,32); */
|
/*ret = ioctl(sys_fd, RKNAND_STORE_VENDOR_SECTOR0, &sysData);*/
|
|
if (0 == access(BASEPARAMETER_PATH, 0))
|
{
|
sys_fd = open(BASEPARAMETER_PATH, O_WRONLY);
|
|
if (sys_fd < 0)
|
{
|
printf("open err %s err=%d\n",BASEPARAMETER_PATH, sys_fd);
|
return -1;
|
}
|
|
lseek(sys_fd, BASE_OFFSET, SEEK_SET);
|
ret = write (sys_fd, (void*)&sysData.data[0], RKNAND_SYS_STORGAE_DATA_LEN);
|
if (ret < 0)
|
{
|
printf("read err %s err=%d\n",BASEPARAMETER_PATH, sys_fd);
|
return -1;
|
}
|
}
|
|
close(sys_fd);
|
if(ret==-1){
|
printf("save lcdparam error\n");
|
}
|
else
|
{
|
updated = 1;
|
nand_crc = file_crc;
|
fclose(fp);
|
sync();
|
reboot(RB_AUTOBOOT);
|
}
|
fclose(fp);
|
return ret;
|
}
|
}
|
return ret;
|
}
|
|
int main(void)
|
{
|
char command[128];
|
strcpy( command, "dd if=/dev/zero of=/dev/block/by-name/baseparameter" );
|
printf("CLEAN PARAMETERS\n");
|
system(command);
|
nand_crc = getfile_crc_from_nand();
|
while(1)
|
{
|
|
rk_update_lcd_parameters_from_sdcard();
|
//gettimeofday(&tv,NULL);
|
//fprintf(stderr, "[%ld] rk_update_lcd_parameters_from_sdcard sleep....\n", tv.tv_usec);
|
//usleep(100000);
|
sleep(5);
|
}
|
return 0;
|
}
|