硬汉嵌入式论坛

 找回密码
 立即注册
查看: 695|回复: 3
收起左侧

这个buf在调试的时候就只有一个长度,是正常的吗

[复制链接]

24

主题

58

回帖

130

积分

初级会员

积分
130
发表于 2023-7-29 16:01:17 | 显示全部楼层 |阅读模式

[C] 纯文本查看 复制代码
usb_sts_type msc_disk_write(uint8_t lun, uint32_t addr, uint8_t *buf, uint32_t len);

[C] 纯文本查看 复制代码
usb_sts_type msc_disk_write(uint8_t lun, uint32_t addr, uint8_t *buf, uint32_t len)
{
  uint32_t flash_addr = addr + USB_FLASH_ADDR_OFFSET;
  uint32_t i = 0, page_len = 2048, tolen = len;
  uint32_t erase_addr = flash_addr;
  switch(lun)
  {
    case 0:
      flash_unlock();
      while(tolen >= page_len)
      {
        flash_sector_erase(erase_addr);
        tolen -= page_len;
        erase_addr += page_len;
      }
      for(i = 0; i < len; i ++)
      {
        flash_byte_program(flash_addr+i, buf[i]);
      }
      flash_lock();
      break;
    case 1:
      break;
  }
  return USB_OK;
}



上一级调用
[C] 纯文本查看 复制代码
usb_sts_type bot_scsi_write10(void *udev, uint8_t lun)
{
  usbd_core_type *pudev = (usbd_core_type *)udev;
  msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
  uint8_t *cmd = pmsc->cbw_struct.CBWCB;
  uint32_t len;

  if(pmsc->msc_state == MSC_STATE_MACHINE_IDLE)
  {
    if((pmsc->cbw_struct.bmCBWFlags & 0x80) == 0x80)
    {
      bot_scsi_sense_code(udev, SENSE_KEY_ILLEGAL_REQUEST, INVALID_COMMAND);
      return USB_FAIL;
    }

    pmsc->blk_addr = cmd[2] << 24 | cmd[3] << 16 | cmd[4] << 8 | cmd[5];
    pmsc->blk_len = cmd[7] << 8 | cmd[8];

    if(bot_scsi_check_address(udev, lun, pmsc->blk_addr, pmsc->blk_len) != USB_OK)
    {
      return USB_FAIL;
    }

    pmsc->blk_addr *= pmsc->blk_size[lun];
    pmsc->blk_len *= pmsc->blk_size[lun];

    if(pmsc->cbw_struct.dCBWDataTransferLength != pmsc->blk_len)
    {
      bot_scsi_sense_code(udev, SENSE_KEY_ILLEGAL_REQUEST, INVALID_COMMAND);
      return USB_FAIL;
    }

    pmsc->msc_state  = MSC_STATE_MACHINE_DATA_OUT;
    len = MIN(pmsc->blk_len, MSC_MAX_DATA_BUF_LEN);
    usbd_ept_recv(pudev, USBD_MSC_BULK_OUT_EPT, (uint8_t *)pmsc->data, len);

  }
  else
  {
    len = MIN(pmsc->blk_len, MSC_MAX_DATA_BUF_LEN);
    if(msc_disk_write(lun, pmsc->blk_addr, pmsc->data, len) != USB_OK)
    {
      bot_scsi_sense_code(udev, SENSE_KEY_HARDWARE_ERROR, MEDIUM_NOT_PRESENT);
      return USB_FAIL;
    }

    pmsc->blk_addr += len;
    pmsc->blk_len -= len;

    pmsc->csw_struct.dCSWDataResidue -= len;

    if(pmsc->blk_len == 0)
    {
      bot_scsi_send_csw(udev, CSW_BCSWSTATUS_PASS);
    }
    else
    {
      len = MIN(pmsc->blk_len, MSC_MAX_DATA_BUF_LEN);
      usbd_ept_recv(pudev, USBD_MSC_BULK_OUT_EPT, (uint8_t *)pmsc->data, len);
    }
  }
  return USB_OK;
}

/**
  * @brief  clear feature
  * @param  udev: to the structure of usbd_core_type
  * @param  etp_num: endpoint number
  * @retval status of usb_sts_type
  */


理论上写入数据的时候,buf传入的是一个数组的地址,应该可以观察到类似buf[0] buf[1]....的,但是这边怎么就只有 一个buf[0]?
[C] 纯文本查看 复制代码
typedef struct
{
  uint8_t msc_state;
  uint8_t bot_status;
  uint32_t max_lun;

  uint32_t blk_nbr[MSC_SUPPORT_MAX_LUN];
  uint32_t blk_size[MSC_SUPPORT_MAX_LUN];

  uint32_t blk_addr;
  uint32_t blk_len;

  uint32_t data_len;
  uint8_t data[MSC_MAX_DATA_BUF_LEN];

  uint32_t alt_setting;

  cbw_type cbw_struct;
  csw_type csw_struct;

}msc_type;

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-7-29 17:51:23 | 显示全部楼层
这几个是函数形参,调试查看不方便,打印出来看下。
回复

使用道具 举报

24

主题

58

回帖

130

积分

初级会员

积分
130
 楼主| 发表于 2023-7-29 19:58:25 | 显示全部楼层
eric2013 发表于 2023-7-29 17:51
这几个是函数形参,调试查看不方便,打印出来看下。

论坛怎么图片都不会正常显示呀。另外想看 模拟U盘 的相关教程可以参照之前的哪个教程呀。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2023-7-29 21:10:10 | 显示全部楼层
Y1ng 发表于 2023-7-29 19:58
论坛怎么图片都不会正常显示呀。另外想看 模拟U盘 的相关教程可以参照之前的哪个教程呀。

论坛的图片复制粘贴插件bug了,需要上传下才行。

模拟U盘的例子做了很多,楼主要看那个ST USB,RL-USB还是USBX
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 01:11 , Processed in 0.246049 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表