HSL:add msc ext cmd support for 0xfffffff3,0xffffffff
author柯飞雄 <kfx@rk29.(none)>
Tue, 23 Aug 2011 03:42:58 +0000 (11:42 +0800)
committer柯飞雄 <kfx@rk29.(none)>
Tue, 23 Aug 2011 03:42:58 +0000 (11:42 +0800)
drivers/mtd/rknand/rknand_base_ko.c [changed mode: 0755->0644]
drivers/usb/gadget/f_mass_storage.c [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 74d486e..71e59bc
@@ -201,6 +201,19 @@ char GetChipSectorInfo(char * pbuf)
     return 0;\r
 }\r
 \r
+int  GetParamterInfo(char * pbuf , int len)\r
+{\r
+       int ret = -1;\r
+       int sector = (len)>>9;\r
+       int LBA = 0;\r
+       if(sector && gpNandInfo->ftl_read)\r
+       {\r
+               ret = gpNandInfo->ftl_read(LBA, sector, pbuf);\r
+       }\r
+       return ret?-1:(sector<<9);\r
+}\r
+\r
+\r
 static int rk28xxnand_block_isbad(struct mtd_info *mtd, loff_t ofs)\r
 {\r
        return 0;\r
@@ -250,7 +263,7 @@ static int rk28xxnand_init(struct rknand_info *nand_info)
     return 0;\r
 }\r
 \r
-\r
+  \r
 /*\r
  * CMY: Ôö¼ÓÁ˶ÔÃüÁîÐзÖÇøÐÅÏ¢µÄÖ§³Ö\r
  *             ÈôcmdlineÓÐÌṩ·ÖÇøÐÅÏ¢£¬ÔòʹÓÃcmdlineµÄ·ÖÇøÐÅÏ¢½øÐзÖÇø\r
old mode 100755 (executable)
new mode 100644 (file)
index 77a1438..bf79372
@@ -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
        }