打印

正在改usb-bulk的程序,发现找不到发送接收的缓存

[复制链接]
3569|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 icicicici 于 2013-4-25 17:57 编辑

在修改bulk的过程中,找到了usb.bot中的usb发送接收开关,可是还是没办法找到他到底把数据放哪了?那个buffer我能让他成为一个数组然后传纯数据吗?我在修改的是sd卡读写的程序,因为要用到bulk传输数据而不是图片文件,请问香主这个怎么办?@香水城  
沙发
icicicici|  楼主 | 2013-4-25 17:49 | 只看该作者
这是usb_mem.c里的
/*******************************************************************************
* Function Name  : UserToPMABufferCopy
* Description    : Copy a buffer from user memory area to packet memory area (PMA)
* Input          : - pbUsrBuf: pointer to user memory area.
*                  - wPMABufAddr: address into PMA.
*                  - wNBytes: no. of bytes to be copied.
* Output         : None.
* Return         : None        .
*******************************************************************************/
void UserToPMABufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
{
  u32 n = (wNBytes + 1) >> 1;   /* n = (wNBytes + 1) / 2 */
  u32 i, temp1, temp2;
  u16 *pdwVal;
  pdwVal = (u16 *)(wPMABufAddr * 2 + PMAAddr);
  for (i = n; i != 0; i--)
  {
    temp1 = (u16) * pbUsrBuf;
    pbUsrBuf++;
    temp2 = temp1 | (u16) * pbUsrBuf << 8;
    *pdwVal++ = temp2;
    pdwVal++;
    pbUsrBuf++;
  }
}
/*******************************************************************************
* Function Name  : PMAToUserBufferCopy
* Description    : Copy a buffer from user memory area to packet memory area (PMA)
* Input          : - pbUsrBuf    = pointer to user memory area.
*                  - wPMABufAddr = address into PMA.
*                  - wNBytes     = no. of bytes to be copied.
* Output         : None.
* Return         : None.
*******************************************************************************/
void PMAToUserBufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
{
  u32 n = (wNBytes + 1) >> 1;/* /2*/
  u32 i;
  u32 *pdwVal;
  pdwVal = (u32 *)(wPMABufAddr * 2 + PMAAddr);
  for (i = n; i != 0; i--)
  {
    *(u16*)pbUsrBuf++ = *pdwVal++;
    pbUsrBuf++;
  }
}

使用特权

评论回复
板凳
icicicici|  楼主 | 2013-4-25 17:53 | 只看该作者
这是回调函数EP1_IN_Callback与EP2_OUT_Callback内的程序,我认为在回调函数里面也是要改,我想实现数据流的发送,可是这里面的内容我不能理解,忘大神指点
/*******************************************************************************
* Function Name  : Mass_Storage_In
* Description    : Mass Storage IN transfer.
* Input          : None.
* Output         : None.
* Return         : None.
//设备->USB
*******************************************************************************/
void Mass_Storage_In (void)
{
        USB_STATUS_REG|=0X10;//标记轮询
        switch (Bot_State)
        {
                case BOT_CSW_Send:
                case BOT_ERROR:
                        Bot_State = BOT_IDLE;
                        SetEPRxStatus(ENDP2, EP_RX_VALID);/* enable the Endpoint to recive the next cmd*/
                        break;
                case BOT_DATA_IN:  //USB从设备读数据
                        switch (CBW.CB[0])
                        {
                                case SCSI_READ10:
                                        USB_STATUS_REG|=0X02;//标记正在读数据
                                        SCSI_Read10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen);
                                        break;
                        }
                        break;
                case BOT_DATA_IN_LAST:
                        Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
                        SetEPRxStatus(ENDP2, EP_RX_VALID);
                        break;
               
                default:
                        break;
        }
}

/*******************************************************************************
* Function Name  : Mass_Storage_Out
* Description    : Mass Storage OUT transfer.
* Input          : None.
* Output         : None.
* Return         : None.
//USB->设备
*******************************************************************************/
void Mass_Storage_Out (void)
{
        u8 CMD;
        USB_STATUS_REG|=0X10;//标记轮询
       
        CMD = CBW.CB[0];
        Data_Len = GetEPRxCount(ENDP2);
        PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len);
        switch (Bot_State)
        {
                case BOT_IDLE:
                        CBW_Decode();
                        break;
                case BOT_DATA_OUT://USB发送数据到设备
                        if (CMD == SCSI_WRITE10)
                        {
                                USB_STATUS_REG|=0X01;//标记正在写数据
                                SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen);
                                break;
                        }
                        Bot_Abort(DIR_OUT);
                        Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
                        Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE);
                        break;
                default:
                        Bot_Abort(BOTH_DIR);
                        Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
                        Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE);
                        break;
        }
}

使用特权

评论回复
地板
hawksabre| | 2013-4-25 19:20 | 只看该作者
帮楼主   顶一个   看看有没有高手能帮你解决这个问题   顶一个

使用特权

评论回复
5
icicicici|  楼主 | 2013-4-26 10:10 | 只看该作者
hawksabre 发表于 2013-4-25 19:20
帮楼主   顶一个   看看有没有高手能帮你解决这个问题   顶一个

困扰有一段时间了~谢谢啦

使用特权

评论回复
6
微兮兮| | 2013-4-26 14:52 | 只看该作者
楼主你现在有进展了吗?
我也是想用MASS STORAGE实现一个大容量传输,利用SD当暂时的存放..满多少K之后一次性发送,这样实现有没有可能呀?

使用特权

评论回复
7
微兮兮| | 2013-4-26 14:53 | 只看该作者
@香水城 @香水城 @香水城  

使用特权

评论回复
8
icicicici|  楼主 | 2013-4-26 17:34 | 只看该作者
本帖最后由 icicicici 于 2013-4-26 18:25 编辑
微兮兮 发表于 2013-4-26 14:52
楼主你现在有进展了吗?
我也是想用MASS STORAGE实现一个大容量传输,利用SD当暂时的存放..满多少K之后一次 ...


我的也是差不多,不过现在想要先撇开SD来实现usb-bulk的stm32与PC的通信,怎么都没办法实现,我想说有没有现成的bulk传输最简单的例子?因为中间夹杂着SD的内存读写什么的,看得有一大坨雾水在头上:'(最主要是吧里面很多人都解决了发送接收的问题,但是我没有看到有人说发些什么?64字节的数据到底发了啥?UserToPMABufferCopy()里面那个Buffer怎么都看不到,伤心

使用特权

评论回复
9
微兮兮| | 2013-4-26 20:53 | 只看该作者
icicicici 发表于 2013-4-26 17:34
我的也是差不多,不过现在想要先撇开SD来实现usb-bulk的stm32与PC的通信,怎么都没办法实现,我想说有没 ...

我刚开始弄BOT这个哈,之前弄过HID,是可以发送64个字节的。你printf一下,把buffer都读出来呀。
如果我有进展的话,再交流哈。
另外,我想说,如果你不用SD的话,是不是一次只能收发64个字节?

请香主看过来,看这里看这里!!!!!是不是本来由于端点地址的设置,一次收发只能64bytes,所谓的大容量传输,只是说将数据都先存着SD里,比如存8次,共512字节,然后再一次性发出去?感谢!

我现在想先实现BOT,再来弄双缓冲。

使用特权

评论回复
10
lovelydonkey1| | 2013-4-27 21:54 | 只看该作者
我也在改写bulk传输这一块,求大神指点,顶一个

使用特权

评论回复
11
微兮兮| | 2013-4-28 15:01 | 只看该作者
icicicici 发表于 2013-4-26 17:34
我的也是差不多,不过现在想要先撇开SD来实现usb-bulk的stm32与PC的通信,怎么都没办法实现,我想说有没 ...

LZ,我看到了这个帖子。https://bbs.21ic.com/icview-329740-1-1.html
难道要通过该USB转串口那个才行么?

使用特权

评论回复
12
icicicici|  楼主 | 2013-5-2 11:30 | 只看该作者
微兮兮 发表于 2013-4-28 15:01
LZ,我看到了这个帖子。https://bbs.21ic.com/icview-329740-1-1.html
难道要通过该USB转串口那个才行么? ...

你说的是速度吧,我之前也看过这个帖子,但是我觉得bulk应该是不会慢吧,没有实践过不敢下定论,其实最快的是自己自定义传输协议,这样可以不用受制于BOT协议,但是就是要写驱动比较麻烦吧,最近都没啥进展:'(

使用特权

评论回复
13
微兮兮| | 2013-5-6 10:46 | 只看该作者
icicicici 发表于 2013-5-2 11:30
你说的是速度吧,我之前也看过这个帖子,但是我觉得bulk应该是不会慢吧,没有实践过不敢下定论,其实最快 ...

我也没有进展。。就用BULK来传输数据怎么这么难。。没有高手指点

使用特权

评论回复
14
icicicici|  楼主 | 2013-5-14 10:31 | 只看该作者
微兮兮 发表于 2013-5-6 10:46
我也没有进展。。就用BULK来传输数据怎么这么难。。没有高手指点

枚举都还没通过

一直在循环这段。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

57

帖子

0

粉丝