#include #include #include #include #include #include #include #include #include #include //#include #include //#include //#include //#include #include //#include #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> 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= 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; }