From 971a633cd7476e9c176f2dfbd73676a36f8e0798 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9F=AF=E9=A3=9E=E9=9B=84?= Date: Tue, 23 Aug 2011 11:42:58 +0800 Subject: [PATCH] HSL:add msc ext cmd support for 0xfffffff3,0xffffffff --- drivers/mtd/rknand/rknand_base_ko.c | 15 ++- drivers/usb/gadget/f_mass_storage.c | 146 +++++++++++++++++++++++++++- 2 files changed, 156 insertions(+), 5 deletions(-) mode change 100755 => 100644 drivers/mtd/rknand/rknand_base_ko.c mode change 100755 => 100644 drivers/usb/gadget/f_mass_storage.c diff --git a/drivers/mtd/rknand/rknand_base_ko.c b/drivers/mtd/rknand/rknand_base_ko.c old mode 100755 new mode 100644 index 74d486e31e2c..71e59bcb49d8 --- a/drivers/mtd/rknand/rknand_base_ko.c +++ b/drivers/mtd/rknand/rknand_base_ko.c @@ -201,6 +201,19 @@ char GetChipSectorInfo(char * pbuf) return 0; } +int GetParamterInfo(char * pbuf , int len) +{ + int ret = -1; + int sector = (len)>>9; + int LBA = 0; + if(sector && gpNandInfo->ftl_read) + { + ret = gpNandInfo->ftl_read(LBA, sector, pbuf); + } + return ret?-1:(sector<<9); +} + + static int rk28xxnand_block_isbad(struct mtd_info *mtd, loff_t ofs) { return 0; @@ -250,7 +263,7 @@ static int rk28xxnand_init(struct rknand_info *nand_info) return 0; } - + /* * CMY: Ôö¼ÓÁ˶ÔÃüÁîÐзÖÇøÐÅÏ¢µÄÖ§³Ö * ÈôcmdlineÓÐÌṩ·ÖÇøÐÅÏ¢£¬ÔòʹÓÃcmdlineµÄ·ÖÇøÐÅÏ¢½øÐзÖÇø diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c old mode 100755 new mode 100644 index 77a143809323..bf793724cd5f --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -84,7 +84,7 @@ #define BULK_BUFFER_SIZE 16384 * 4//4096 /* flush after every 4 meg of writes to avoid excessive block level caching */ -#define MAX_UNFLUSHED_BYTES (512 * 1024)// (4 * 1024 * 1024) //original value is 4MB,Modifyed by xbw at 2011-08-18 +#define MAX_UNFLUSHED_BYTES (4 * 1024 * 1024) /*-------------------------------------------------------------------------*/ @@ -1851,6 +1851,133 @@ static void deferred_restart(struct work_struct *dummy) kernel_restart("loader"); } static DECLARE_WORK(restart_work, deferred_restart); + +typedef struct tagLoaderParam +{ + int tag; + int length; + char parameter[1]; + int crc; +} PARM_INFO; +#define PARM_TAG 0x4D524150 +#define MSC_EXT_DBG 1 +extern int GetParamterInfo(char * pbuf , int len); +static int do_get_product_name(int ret ,char *buf) +{ + char tmp[32]; + PARM_INFO *pi; + char *pp,*spp; + char *tag = "MACHINE_MODEL:"; + int i; + #if MSC_EXT_DBG + char tbuf[1024]; + if( buf == NULL ) buf = tbuf; + #endif + i = GetParamterInfo( buf , 1024 ); + pi = (PARM_INFO*)buf; + if( pi->tag != PARM_TAG ){ +error_out: + printk("paramter error,tag=0x%x\n" , pi->tag ); + memset( buf , 0 , ret ); + strcpy( buf , "UNKNOW" ); + return ret; + } + if( pi->length+sizeof(PARM_INFO) > i ) { + GetParamterInfo( buf , pi->length+sizeof(PARM_INFO) + 511 ); + } + pp = strstr( pi->parameter , tag ); + if( !pp ) goto error_out; + pp+= strlen(tag); // sizeof "MACHINE_MODEL:" + while( *pp == ' ' || *pp == '\t' ) { + if(pp - pi->parameter >= pi->length) + break; + pp++; + } + spp = pp; + while( *pp != 0x0d && *pp != 0x0a ) { + if(pp - pi->parameter >= pi->length) + break; + pp++; + } + *pp = 0; + i = pp - spp; + if( i >= ret ) i = ret -1; + memcpy( tmp , spp , i ); + memset( buf , 0 , ret ); + memcpy( buf , tmp , i ); + printk("%s%s\n" , tag , buf ); + return ret; +} + +static int do_get_versions( int ret ,char* buf ) +{ + /* get boot version and fireware version from cmdline + * bootver=2010-07-08#4.02 firmware_ver=1.0.0 // Firmware Ver:16.01.0000 + * return format: 0x02 0x04 0x00 0x00 0x00 0x01 + * RK29: bootver=2011-07-18#2.05 firmware_ver=0.2.3 (==00.02.0003) + */ +#define ASC_BCD0( c ) (((c-'0'))&0xf) +#define ASC_BCD1( c ) (((c-'0')<<4)&0xf0) + + char *ver = buf; + char *p_l , *p_f; + + #if MSC_EXT_DBG + char tbuf[1024]; + if( ver == NULL ) ver = tbuf; + #endif + memset( ver , 0x00 , ret ); + p_l = strstr( saved_command_line , "bootver=" ); + if( !p_l ) { + return 0; + } + p_f = strstr( p_l , "firmware_ver=" ); + if( !p_f ) { + return 0; + } + if( !(p_l = strnchr( p_l, p_f - p_l , '#')) ) + return 0; + p_l++; + p_f+=strlen("firmware_ver="); + if( p_l[1] == '.' ) { + ver[1] = ASC_BCD0(p_l[0]); + p_l+=2; + } else { + ver[1] = ASC_BCD1(p_l[0])|ASC_BCD0(p_l[1]); + p_l+=3; + } + ver[0] = ASC_BCD1(p_l[0])|ASC_BCD0(p_l[1]); + if( p_f[1] == '.' ) { + ver[5] = ASC_BCD0(p_f[0]); + p_f+=2; + } else { + ver[5] = ASC_BCD1(p_f[0])|ASC_BCD0(p_f[1]); + p_f+=3; + } + if( p_f[1] == '.' ) { + ver[4] = ASC_BCD0(p_f[0]); + p_f+=2; + } else { + ver[4] = ASC_BCD1(p_f[0])|ASC_BCD0(p_f[1]); + p_f+=3; + } + ver[2] = ASC_BCD0(p_f[0]); + p_f++; + if( p_f[0] != ' ' ){ + ver[2] |= ASC_BCD1(p_f[0]); + p_f++; + } + // only support 2 byte version. + ver[3] = 0; + + #if MSC_EXT_DBG + printk("VERSION:%02x %02x %02x %02x %02x %02x\n" , + ver[0],ver[1],ver[2],ver[3],ver[4],ver[5]); + #endif + + + return ret; +} #endif static int do_scsi_command(struct fsg_dev *fsg) @@ -2052,11 +2179,22 @@ static int do_scsi_command(struct fsg_dev *fsg) break; #ifdef CONFIG_ARCH_RK29 case 0xff: - if (fsg->cmnd_size >= 6 && fsg->cmnd[1] == 0xe0 && - fsg->cmnd[2] == 0xff && fsg->cmnd[3] == 0xff && - fsg->cmnd[4] == 0xff && fsg->cmnd[5] == 0xfe) { + if( fsg->cmnd[1] != 0xe0 || + fsg->cmnd[2] != 0xff || fsg->cmnd[3] != 0xff || + fsg->cmnd[4] != 0xff ) + break; + if (fsg->cmnd_size >= 6 && fsg->cmnd[5] == 0xfe) { schedule_work(&restart_work); } + else if ( fsg->cmnd[5] == 0xf3 ) { + fsg->data_size_from_cmnd = fsg->data_size; + /* get product name from parameter section */ + reply = do_get_product_name( fsg->data_size,bh->buf ); + } + else if ( fsg->cmnd[5] == 0xff ){ + fsg->data_size_from_cmnd = fsg->data_size; + reply = do_get_versions( fsg->data_size,bh->buf ); + } break; #endif } -- 2.34.1