boolean writeBackUpCommand(script_process_type MDM_MODEM ) { int mtd_op_result = 0; // char temp[10] = "test plz"; if(userDataBackUpInfo.dl_info_cnt<MAX_INFO_COUNT) userDataBackUpInfo.dl_info_cnt++; else userDataBackUpInfo.dl_info_cnt=1; if(MDM_MODEM==MODEM_BACKUP){ mtd_op_result = lge_write_srd_block(srd_bytes_pos_in_emmc, (char*)&userDataBackUpInfo, sizeof(user_data_backup_info)); //mtd_op_result = lge_write_srd_block(srd_bytes_pos_in_emmc, temp, sizeof(char)*10); printk(KERN_INFO "[SRD] lge_write_block srd_bytes_pos = %d", srd_bytes_pos_in_emmc); } if(mtd_op_result!= sizeof(user_data_backup_info)) // if(mtd_op_result!= sizeof(char)*10) { printk(KERN_INFO "[SRD] write misc fail!!"); return FALSE; } write_counter_sector ++; printk(KERN_INFO "[SRD] write misc success write_cnt = %d !!", write_counter_sector); return TRUE; }
//for SRD int lge_erase_srd_block(int bytes_pos, size_t erase_size) { unsigned char *erasebuf; unsigned written = 0; erasebuf = kmalloc(erase_size, GFP_KERNEL); // allocation exception handling if(!erasebuf) { printk("%s, allocation failed, expected size : %d\n", __func__, erase_size); return 0; } memset(erasebuf, 0xff, erase_size); written += lge_write_srd_block(bytes_pos, erasebuf, erase_size); kfree(erasebuf); return written; }
boolean writeBackUpNVdata( char * ram_start_address , unsigned int size) { int mtd_op_result = 0; unsigned char *buf = (char *)ram_start_address; mtd_op_result = lge_write_srd_block(srd_bytes_pos_in_emmc+(write_counter_sector*512), buf, size); if(mtd_op_result!= size) { return FALSE; } write_counter_sector =0; //todo ?? srd_bytes_pos_in_emmc=srd_bytes_pos_in_emmc +512 , app 에서는 info만 write ,, return TRUE; }
asmlinkage long sys_LGE_Dload_SRD (void *req_pkt_ptr, void *rsp_pkt_ptr) { udbp_req_type *req_ptr = (udbp_req_type *) req_pkt_ptr; udbp_rsp_type *rsp_ptr = (udbp_rsp_type *) rsp_pkt_ptr; //uint16 rsp_len = pkg_len; int write_size=0 , mtd_op_result=0; // DIAG_TEST_MODE_F_rsp_type union type is greater than the actual size, decrease it in case sensitive items switch(req_ptr->header.sub_cmd) { case SRD_INIT_OPERATION: printk(KERN_INFO "[SRD] SRD_INIT_OPERATION \n"); diag_SRD_Init(req_ptr,rsp_ptr); break; case USERDATA_BACKUP_REQUEST: printk(KERN_INFO "[SRD] USERDATA_BACKIP_REQUEST \n"); //remote_rpc_srd_cmmand(req_ptr, rsp_ptr); //userDataBackUpStart() ���⼭ ... shared ram ���� �ϵ���. .. diag_userDataBackUp_entrySet(req_ptr,rsp_ptr,0); //write info data , after rpc respons include write_sector_counter //todo .. rsp_prt->header.write_sector_counter, how about checking no active nv item ; // write ram data to emmc misc partition as many as retruned setor counters load_srd_shard_base=smem_alloc(SMEM_ERR_CRASH_LOG, SIZE_OF_SHARD_RAM); //384K byte if (load_srd_shard_base ==NULL) { ((udbp_rsp_type*)rsp_ptr)->header.err_code = UDBU_ERROR_CANNOT_COMPLETE; printk(KERN_INFO "[SRD] backup req smem alloc fail!! "); break; // return rsp_ptr; } write_size= req_ptr->nv_counter *256; //return nv backup counters printk(KERN_INFO "[SRD] backup req// nv_counter = %d", req_ptr->nv_counter); write_size= (req_ptr->header.packet_version/0x10000) *256; //return nv backup counters //write_size = 512; printk(KERN_INFO "[SRD] backup req// pkt_version = %d", (int) req_ptr->header.packet_version); if( write_size >SIZE_OF_SHARD_RAM) { ((udbp_rsp_type*)rsp_ptr)->header.err_code = UDBU_ERROR_CANNOT_COMPLETE; //hue.. break; } load_srd_kernel_base=kmalloc((size_t)write_size, GFP_KERNEL); memcpy(load_srd_kernel_base,load_srd_shard_base,write_size); //srd_bytes_pos_in_emmc+512 means that info data already writed at emmc first sector mtd_op_result = lge_write_srd_block(srd_bytes_pos_in_emmc+512, load_srd_kernel_base, write_size); //512 info data if(mtd_op_result!= write_size) { ((udbp_rsp_type*)rsp_ptr)->header.err_code = UDBU_ERROR_CANNOT_COMPLETE; kfree(load_srd_kernel_base); printk(KERN_INFO "[SRD] backup req// mtd_op != wtite_size"); break; } kfree(load_srd_kernel_base); #if 0 if ( !writeBackUpNVdata( load_srd_base , write_size)) { ((udbp_rsp_type*)rsp_ptr)->header.err_code = UDBU_ERROR_CANNOT_COMPLETE; return rsp_ptr; } #endif break; case GET_DOWNLOAD_INFO : break; case EXTRA_NV_OPERATION : #ifdef LG_FW_SRD_EXTRA_NV diag_extraNv_entrySet(req_ptr,rsp_ptr); #endif break; case PRL_OPERATION : #ifdef LG_FW_SRD_PRL diag_PRL_entrySet(req_ptr,rsp_ptr); #endif break; default : rsp_ptr =NULL; //(void *) diagpkt_err_rsp (DIAG_BAD_PARM_F, req_ptr, pkt_len); break; } /* Execption*/ if (rsp_ptr == NULL){ return FALSE; } printk(KERN_INFO "[SRD] syscall complete rsp->err_code = %d ", (int)rsp_ptr->header.err_code); return TRUE; }