hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-08-16 11:02
inquiry属于windows读数据的rbc命令类型,testunit属于无数据的rbc命令,
BOOLEAN SPC_TestUnit(void)
{
//printk(\"In SPC_TestUnit.\\n\");

TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
    TPBulk_CSWHandler();

USBWriteCommand(USB_COMMAND_SELECT_ENDPOINT + USB_ENDPOINT_BULK_IN);
    FlexByte = USBReadData();
    if((FlexByte&0x01) == 0x00) // BulkIn is empty
    {
//     printk(\"send bulk CSW\\n\");
     //show_char_buf(BOTXfer_pData,BOTXfer_wResidue);
if(BOTXfer_wResidue>0)
USBWriteEndpoint(USB_ENDPOINT_BULK_IN, (char **)&BOTXfer_pData,&BOTXfer_wResidue);
   if(BOTXfer_wResidue == 0)
   BOTFSMstate = USBFSM4BOT_IDLE; // Goto BOTFSMstate_IDLE
}    
return (TRUE);
}
首先设置csw,传输状态为BOTFSMstate = USBFSM4BOT_CSW;写csw到endpoint in fifo里,d12 ep in fifo大小64字节,显然13字节的csw一次发送完毕,传输状态设为USBFSW4BOT_IDLE。
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-08-16 11:04
read也是读数据,跟inquiry差不多。
BOOLEAN RBC_Read(void)
{

#define cdbRead RBC_CDB.RbcCdb_Read
unsigned int tt;
BOOLEAN retStatus = FALSE;
tt = cdbRead.LBA.LBA_W8.LBA_3 <<24 | cdbRead.LBA.LBA_W8.LBA_2 <<16 |cdbRead.LBA.LBA_W8.LBA_1 <<8 |cdbRead.LBA.LBA_W8.LBA_0;
//printk(\"In RBC_Read.\\n\");
//BOTXfer_pData =(PINT8) logic0_sec;
    
//if(tt >10) tt =0;   //for debug only,we do not want to halt here for mem limit.
BOTXfer_pData = logic0_sec + (tt)*512; //save to correct sector
BOTXfer_wResidue = CBW_wXferLen; //sizeof(logic0_sec)*(cdbRead.XferLength_1*256+cdbRead.XferLength_0);
//printk(\"BOTXfer_pData is %p,BOTXfer_wResidue=%d\\n\",BOTXfer_pData,BOTXfer_wResidue);

if(BOTXfer_wResidue > 1024*10) { // large than 10k,we want discard last part for mem limit.
//longdatacount = 512;
}

retStatus = TRUE;
    Xfer_Space &= BOTXFERSPACE_MASK;
    //BOTXfer_atROM = 1;
    Xfer_Space = BOTXfer_atROM; //bit6 =1

BOTFSMstate = USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN

TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);

USBWriteCommand(USB_COMMAND_SELECT_ENDPOINT + USB_ENDPOINT_BULK_IN);
    FlexByte = USBReadData();
//printk(\"ep5 status is %x.\\n\",FlexByte);
    if(FlexByte == 0) {// BulkIn is not full
//printk(\"write data len is%d\\n\",BOTXfer_wResidue);
// show_char_buf(&inquiryData,BOTXfer_wResidue);
//show_char_buf(BOTXfer_pData,BOTXfer_wResidue);
USBWriteEndpoint(USB_ENDPOINT_BULK_IN, (char **)&BOTXfer_pData,&BOTXfer_wResidue);
}
//printk(\"First sent inquiry,len is %d\\n\",BOTXfer_wResidue);
return retStatus;
#undef cdbRead
}
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-08-16 11:06
write是windows写数据类型命令。
BOOLEAN RBC_Write(void) //0x2a
{
unsigned int tt;
#define cdbWrite    RBC_CDB.RbcCdb_Write


tt = cdbWrite.LBA.LBA_W8.LBA_3 <<24 | cdbWrite.LBA.LBA_W8.LBA_2 <<16 |cdbWrite.LBA.LBA_W8.LBA_1 <<8 |cdbWrite.LBA.LBA_W8.LBA_0;

//printk(\"In RBC_Write,len=%d,start sector=%d,logic0_sec=%p.\\n\",CBW_wXferLen,tt,logic0_sec);

    Xfer_Space &= BOTXFERSPACE_MASK;
    //BOTXfer_atATA = 1;
    BOTXfer_pData = logic0_sec + (tt)*512; //save to correct sector
    BOTXfer_wResidue = CBW_wXferLen;
    printk(\"In RBC write,BOTXfer_pData=%p,BOTXfer_wResidue=%d.\\n\",BOTXfer_pData,BOTXfer_wResidue);
    //sUSB.usBulkOutCount = CBW_wXferLen;

if(BOTXfer_wResidue > 1024*10) { // large than 10k,we want discard last part for mem limit.
//longdatacount = 512;
//show_flag = 1;
}

TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);

BOTFSMstate = USBFSM4BOT_DATAOUT;

return (TRUE);

#undef cdbWrite
}
只要设置正确状态,windows发送CBW后跟着发数据,就会进入endpoint out中断,在out中断里读数据,完成后发送CSW。
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2002-08-16 11:08
readcapacity告诉windows有多少个扇区,每个扇区大小,这样windows就知道你的U盘的容量了。
BOOLEAN RBC_ReadCapacity(void)
{
//printk(\"In RBC_ReadCapacity.\\n\");
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity

/*
// Calculate last sector.
*/
bFlags.bits.BI_Stalled = 0;
bFlags.bits.BO_Stalled = 0;
cdbReadCap.tmpVar.l[1] =  RAMDISKSECTORS; //201 ;//4096*16; //((INT32)ATADevExt_IDData.CurrentSectorCapacity.u0) - 1;

// 32bits info
//ATADevExt_IDData.CurrentSectorCapacity.ints.i0 = Hal4Sys_ATADataPortInW()
//ATADevExt_IDData.CurrentSectorCapacity.ints.i1 = Hal4Sys_ATADataPortInW()
/* struct
    {
        INT8 c3;  // MSB for 8051 Keil C
        INT8 c2;
        INT8 c1;
        INT8 c0;   // LSB for 8051 Keil C
    } chars0;
*/
/* store it in big endian */
cdbReadCap.tmpVar.CapData.LBA_3 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c3;
cdbReadCap.tmpVar.CapData.LBA_2 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c2;
cdbReadCap.tmpVar.CapData.LBA_1 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c1;
cdbReadCap.tmpVar.CapData.LBA_0 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c0;

/*
// Bytes Per Block is 512Bytes
// 00020000 is 0x200 in big endian
*/
cdbReadCap.tmpVar.CapData.BlockLen_3 = 0;
cdbReadCap.tmpVar.CapData.BlockLen_2 = 0;
cdbReadCap.tmpVar.CapData.BlockLen_1 = 0x02;  //0x02;
cdbReadCap.tmpVar.CapData.BlockLen_0 = 0;
/*
// Adjust TPBulkXfer Paras
*/
    Xfer_Space &= BOTXFERSPACE_MASK;
    Xfer_Space = BOTXfer_atRAM;

BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA);
BOTXfer_pData = (PINT8)&(cdbReadCap.tmpVar);

TPBulksup_ErrorHandler(CASE6, BOTXfer_wResidue);
RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);

BOTFSMstate = USBFSM4BOT_DATAIN;

USBWriteCommand(USB_COMMAND_SELECT_ENDPOINT + USB_ENDPOINT_BULK_IN);
    FlexByte = USBReadData();
//printk(\"ep5 status is %x.\\n\",FlexByte);
    if(FlexByte == 0) {// BulkIn is not full
//printk(\"inquiry data len is%d\\n\",BOTXfer_wResidue);
// show_char_buf(&inquiryData,BOTXfer_wResidue);
//show_char_buf(BOTXfer_pData,BOTXfer_wResidue);
USBWriteEndpoint(0x05, (char **)&BOTXfer_pData,&BOTXfer_wResidue);
}

return(TRUE);
#undef cdbReadCap
}
我分配了201*512字节内存,因此我的U盘大概80K。
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-08-16 11:13
基本命令就这么多,如果windows还发送了其他命令,只要敷衍过去就行了。这样一个U盘就出现在windows里,很简单吧?:)程序很大部分是参考philips的例程,大家有不明白的可以去看那个程序,或者发email跟我讨论,tianfulei@sina.com
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2002-08-16 11:15
另外,请高手指点多分区U盘该怎么实现。谢谢!
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2002-08-16 15:06
你的bus bound 是什么呢?工具名是bus bound 吗?
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2002-08-16 17:12
论坛上有这个东西。
free_best
驱动牛犊
驱动牛犊
  • 注册日期2002-03-10
  • 最后登录2002-12-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2002-08-21 01:49
将文件系统的磁盘信息翻译成NAND_FLASH地址的程序放到固件中就行,我已经实现;但是不知道问什么,空间少了2M,如有高手请指教
free_best
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2002-08-21 09:22
mbr里1024block就对应logic 1000个block,512-500,再加上fat表等,可用容量减小了不少。你实际flash容量多大?
qzhqzh
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2018-07-12
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望23点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2002-08-21 09:50
用户被禁言,该主题自动屏蔽!
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2002-08-21 15:34
我的例子?我的情况比较特殊,没有几个人用arm来控制d12,给了也不能编译。
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2002-08-23 15:16
继续贴,ram换成smartmedia。
首先要知道smartmedia卡的组织结构。从大到小分zone,block,sector。一般1024个block为1zone,block跟sector关系与容量有关:(见www.ssfdc.or.jp标准)
1M 2M 4M 8M 16M 32M 64M 128M
4  8  8  16 16  16  32  32
zone感觉更像个逻辑概念,实际访问时不会有zone出现。
读写地址是sector物理地址,block则在擦除时有用,所有擦除按照block单位,先擦除才能写。
singmama
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2007-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2002-08-23 23:00
好东西,继续呀
上一页 下一页
游客

返回顶部