[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/os/linux/linux-3.4.x/drivers/mtd/mtdadapter.c b/ap/os/linux/linux-3.4.x/drivers/mtd/mtdadapter.c
new file mode 100644
index 0000000..c7b418a
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/drivers/mtd/mtdadapter.c
@@ -0,0 +1,358 @@
+/* drivers/mtd/mtdadapt.c
+*
+* Mtd api adapt driver for nand&nor.
+*
+* Copyright (c) 2018 ZTE Ltd.
+*
+* This software is licensed under the terms of the GNU General Public
+* License version 2, as published by the Free Software Foundation, and
+* may be copied, distributed, and modified under those terms.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+*/
+
+#include <linux/slab.h>
+#include <linux/kernel.h>
+#include <linux/mtd/mtd.h>
+#include <linux/module.h>
+
+#define READ_ZLOADER_FLAG_SIZE 0x800
+#define WRITE_ZLOADER_FLAG_SIZE 0x3000
+
+
+extern struct mtd_info *mtd_fota;
+extern int g_zload_read_only_flag;
+
+#ifndef USE_CPPS_KO
+extern unsigned int zOss_NvItemRead(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen);
+extern unsigned int zOss_NvItemWrite(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen);
+#endif
+
+/*zdd need modify*/
+int zDrvNand_ChangeNvrAttr(unsigned int rw )
+{
+ int ret = 0;
+ // ret = nand_nv_mid_r_set_to_rw(rw);
+ return ret;
+}
+EXPORT_SYMBOL(zDrvNand_ChangeNvrAttr);
+
+/*
+* nv read interface.
+* dwstart: nv addr to read
+* dwLen: length of nv to read
+* to: memory addr
+*/
+int zDrvNand_Read(unsigned int dwStart, unsigned int dwLen, unsigned char* to)
+{
+ int ret = 0;
+
+ #ifdef USE_CPPS_KO
+ ret = cpps_callbacks.zOss_NvItemRead(dwStart, to, dwLen);
+ #else
+ ret = zOss_NvItemRead(dwStart, to, dwLen);
+ #endif
+
+ return ret;
+}
+EXPORT_SYMBOL(zDrvNand_Read);
+
+/*
+* nv write interface.
+* dwstart: nv addr to program
+* dwLen: length of nv to program
+* from: memory addr
+*/
+int zDrvNand_Program(unsigned int dwStart, unsigned int dwLen, unsigned char* from)
+{
+ int ret = 0;
+
+ #ifdef USE_CPPS_KO
+ ret = cpps_callbacks.zOss_NvItemWrite(dwStart,from, dwLen);
+ #else
+ ret = zOss_NvItemWrite(dwStart,from, dwLen);
+ #endif
+
+ return ret;
+}
+EXPORT_SYMBOL(zDrvNand_Program);
+
+/*zdd need modify*/
+int zDrvNand_SmsRead(unsigned int dwStart, unsigned int dwLen, unsigned char* to)
+{
+ int ret = 0;
+
+ //ret = zftl_wrapper_read((char *)"sms", dwStart, dwLen, to);
+
+ return ret;
+}
+
+/*zdd need modify*/
+int zDrvNand_SmsProgram(unsigned int dwStart, unsigned int dwLen, unsigned char* from)
+{
+ int ret = 0;
+
+ //ret = zftl_wrapper_write((unsigned char *)"sms", dwStart, dwLen, from);
+
+ return ret;
+}
+
+/*zdd need modify*/
+int zDrvNand_SimNvRead(unsigned int dwStart, unsigned int dwLen, unsigned char* to)
+{
+ int ret = 0;
+#if 0//fyi
+ NAND_LOCK
+ nand_clk_gate(SYSCLK_ENABLE);
+ ret = nand_simnv_read(dwStart, dwLen, to);
+ nand_clk_gate(SYSCLK_DISABLE);
+ NAND_UNLOCK
+
+ if(ret == -1)
+ {
+ zftl_res = 1;
+ zDrvNand_SetSimNvFlag(dwStart);/*ECC REBOOT*/
+ zftl_res = 0;
+ }
+#endif
+ //ret = zftl_wrapper_read((unsigned char *)"simnv", dwStart, dwLen, to);
+
+ return ret;
+}
+
+/*zdd need modify*/
+int zDrvNand_SimNvProgram(unsigned int dwStart, unsigned int dwLen, unsigned char* from)
+{
+ int ret = 0;
+#if 0//fyi
+ NAND_LOCK
+ nand_clk_gate(SYSCLK_ENABLE);
+ ret = nand_simnv_program(dwStart, dwLen, from);
+ nand_clk_gate(SYSCLK_DISABLE);
+ NAND_UNLOCK
+ if(ret == -1)
+ {
+ zftl_res = 1;
+ zDrvNand_SetSimNvFlag(dwStart);/*ECC REBOOT*/
+ zftl_res = 0;
+ }
+#endif
+ //ret = zftl_wrapper_write((unsigned char *)"simnv", dwStart, dwLen, from);
+
+ return ret;
+}
+
+/*zdd need modify*/
+int zDrvNand_SimNvFacRead(unsigned int dwStart, unsigned int dwLen, unsigned char* to)
+{
+ int ret = 0;
+#if 0//fyi
+ NAND_LOCK
+ nand_clk_gate(SYSCLK_ENABLE);
+ ret = nand_simnvfac_read(dwStart, dwLen, to);
+ nand_clk_gate(SYSCLK_DISABLE);
+ NAND_UNLOCK
+#endif
+ //ret = zftl_wrapper_read((unsigned char *)"simnvfac", dwStart, dwLen, to);
+
+ return ret;
+}
+
+/*zdd need modify*/
+int zDrvNand_SimNvFacProgram(unsigned int dwStart, unsigned int dwLen, unsigned char* from)
+{
+ int ret = 0;
+#if 0//fyi
+ NAND_LOCK
+ nand_clk_gate(SYSCLK_ENABLE);
+ ret = nand_simnvfac_program(dwStart, dwLen, from);
+ nand_clk_gate(SYSCLK_DISABLE);
+ NAND_UNLOCK
+#endif
+ //ret = zftl_wrapper_write((unsigned char *)"simnvfac", dwStart, dwLen, from);
+
+ return ret;
+}
+
+/*zdd need modify*/
+int zDrvNand_NvRwEccMake(unsigned int dwStart, unsigned int dwLen)
+{
+ char buffer[2048];
+
+ //if( dwStart >= NVRW_SIZE||dwStart < 0 || (dwStart +dwLen)> NVRW_SIZE|| dwLen > 2048)
+ // return -1;
+//fyi nand_nvrw_mid_ecc_make(dwStart,dwLen,buffer);
+ return 0;
+}
+EXPORT_SYMBOL(zDrvNand_NvRwEccMake);
+
+/*zdd need modify*/
+int zDrvNand_EccMake(unsigned char* partName,unsigned int dwStart, unsigned int dwLen)
+{
+ return 0;
+}
+EXPORT_SYMBOL(zDrvNand_EccMake);
+
+/*
+* get the bootflag from flash.
+* return: 0, dl off 1, dl on
+*/
+unsigned int zDrvNand_ReadBootflag( void )
+{
+ unsigned int bootflag = 0;
+
+ char value = 0;
+ int retlen = 0;
+
+ unsigned char *buffer = kzalloc(READ_ZLOADER_FLAG_SIZE,GFP_KERNEL);
+ if( buffer == NULL )
+ return -1;
+
+ if(mtd_read(mtd_fota,0,READ_ZLOADER_FLAG_SIZE,&retlen,buffer))/* BOOTFLAGÔÚnandµÄµÚ20~27×Ö½Ú */
+ {
+ kfree(buffer);
+ return 1;
+ }
+ memcpy(&value, buffer+2, 1);
+ bootflag = value;
+
+ if( bootflag == 0x5a)
+ {
+ bootflag = 1;
+ }
+ else
+ {
+ bootflag = 0;
+ }
+ kfree(buffer);
+
+ return bootflag;
+}
+EXPORT_SYMBOL(zDrvNand_ReadBootflag);
+
+/*
+* write the bootflag to flash.
+* flag: 0,dl off else dl on
+*/
+unsigned int zDrvNand_WriteBootflag(unsigned int flag)
+{
+
+ unsigned int ret = 0;
+ char value = 0;
+ int bootflag = 0;
+ int retlen = 0;
+ struct erase_info ei;
+
+ unsigned char *buffer = kzalloc(WRITE_ZLOADER_FLAG_SIZE,GFP_KERNEL);
+
+ if( buffer == NULL )
+ return -1;
+
+ if(mtd_read(mtd_fota,0,WRITE_ZLOADER_FLAG_SIZE,&retlen,buffer))/* BOOTFLAGÔÚnandµÄµÚ20~27×Ö½Ú */
+ {
+ kfree(buffer);
+ return -1;
+ }
+ if(flag == 0 )
+ {
+ bootflag = 0x00;
+ memset(&value, bootflag, 1);
+ }
+ else
+ {
+ bootflag = 0x5a;
+ memset(&value, bootflag, 1);
+ }
+
+ memcpy(buffer+2, &value, 1);
+ memset(&ei, 0, sizeof(struct erase_info));
+ ei.mtd = mtd_fota;
+ ei.addr = 0;
+ ei.len = mtd_fota->erasesize;
+ g_zload_read_only_flag = 1;
+ ret = mtd_erase(mtd_fota, &ei); /*²Á³ýµÚÒ»¿é*/
+ ret = mtd_write(mtd_fota,0,WRITE_ZLOADER_FLAG_SIZE,&retlen,buffer);
+ g_zload_read_only_flag = 0;
+ kfree(buffer);
+
+ return 0;
+
+}
+EXPORT_SYMBOL(zDrvNand_WriteBootflag);
+
+/*
+* get the usbtimeout flag from flash.
+* return: should be 1~10
+*/
+unsigned int zDrvNand_ReadUsbtimeout( void )
+{
+
+ unsigned int usbtimeout = 0;
+ char value = 0;
+ int retlen = 0;
+
+ unsigned char *buffer = kzalloc(READ_ZLOADER_FLAG_SIZE,GFP_KERNEL);
+ if( buffer == NULL )
+ return -1;
+
+ if(mtd_read(mtd_fota,0,READ_ZLOADER_FLAG_SIZE,&retlen,buffer))/* BOOTFLAGÔÚnandµÄµÚ20~27×Ö½Ú */
+ {
+ kfree(buffer);
+ return -1;
+ }
+ memcpy(&value, buffer+3, 1);
+ usbtimeout = value;
+
+ kfree(buffer);
+ return usbtimeout;
+
+}
+EXPORT_SYMBOL(zDrvNand_ReadUsbtimeout);
+
+/*
+* write the usbtimeout flag to flash.
+* flag: should be 1~10
+*/
+unsigned int zDrvNand_WriteUsbtimeout( unsigned int flag )
+{
+
+ unsigned int ret = 0;
+ uint8_t oob[256];
+ int i =0;
+ int times = 0;
+ int retlen = 0;
+ char value = 0;
+ struct erase_info ei;
+
+ unsigned char *buffer = kzalloc(WRITE_ZLOADER_FLAG_SIZE,GFP_KERNEL); /* ZLOADERºÍ·ÖÇø±í¹²8192BYTES */
+
+ if( buffer == NULL )
+ return -1;
+
+ if(mtd_read(mtd_fota,0,WRITE_ZLOADER_FLAG_SIZE,&retlen,buffer))/* BOOTFLAGÔÚnandµÄµÚ20~27×Ö½Ú */
+ {
+ kfree(buffer);
+ return -1;
+ }
+
+ memset(&value, flag, 1);
+ memcpy(buffer+3, &value, 1);
+
+ memset(&ei, 0, sizeof(struct erase_info));
+ ei.mtd = mtd_fota;
+ ei.addr = 0;
+ ei.len = mtd_fota->erasesize;
+ g_zload_read_only_flag = 1;
+ ret = mtd_erase(mtd_fota, &ei); /*²Á³ýµÚÒ»¿é*/
+ ret = mtd_write(mtd_fota,0,WRITE_ZLOADER_FLAG_SIZE,&retlen,buffer);
+ g_zload_read_only_flag = 0;
+ kfree(buffer);
+
+ return ret;
+}
+EXPORT_SYMBOL(zDrvNand_WriteUsbtimeout);
+