[Atmel] 用SAM-BA或JLINK跑ATSAM4E16的程序(22) USB MSC

[复制链接]
 楼主| ddllxxrr 发表于 2015-12-2 20:17 | 显示全部楼层 |阅读模式
MSC (Mass Storage)即大容量存贮。

下边这个程序,在设备枚举后,USB主机开始配置。当USB MSC接串被主机接受后,主设备开始始能这个接口,UDI_MSC_ENABLE_EXT()回调函数被调用。这样当事件被接收udi_msc_rrocess_trans()必须被使能。

msc自动处理内存访问通过在主函数调用udi_msc_process_trans();

以下是udi_msc_process_trans();


  1. static void udi_msc_spc_mode_sense(bool b_sense10)
  2. {
  3.         // Union of all mode sense structures
  4.         union sense_6_10 {
  5.                 struct {
  6.                         struct scsi_mode_param_header6 header;
  7.                         struct spc_control_page_info_execpt sense_data;
  8.                 } s6;
  9.                 struct {
  10.                         struct scsi_mode_param_header10 header;
  11.                         struct spc_control_page_info_execpt sense_data;
  12.                 } s10;
  13.         };

  14.         uint8_t data_sense_lgt;
  15.         uint8_t mode;
  16.         uint8_t request_lgt;
  17.         uint8_t wp;
  18.         struct spc_control_page_info_execpt *ptr_mode;
  19.         UDC_BSS(4)  static union sense_6_10 sense;

  20.         // Clear all fields
  21.         memset(&sense, 0, sizeof(sense));

  22.         // Initialize process
  23.         if (b_sense10) {
  24.                 request_lgt = udi_msc_cbw.CDB[8];
  25.                 ptr_mode = &sense.s10.sense_data;
  26.                 data_sense_lgt = sizeof(struct scsi_mode_param_header10);
  27.         } else {
  28.                 request_lgt = udi_msc_cbw.CDB[4];
  29.                 ptr_mode = &sense.s6.sense_data;
  30.                 data_sense_lgt = sizeof(struct scsi_mode_param_header6);
  31.         }

  32.         // No Block descriptor

  33.         // Fill page(s)
  34.         mode = udi_msc_cbw.CDB[2] & SCSI_MS_MODE_ALL;
  35.         if ((SCSI_MS_MODE_INFEXP == mode)
  36.                         || (SCSI_MS_MODE_ALL == mode)) {
  37.                 // Informational exceptions control page (from SPC)
  38.                 ptr_mode->page_code =
  39.                                 SCSI_MS_MODE_INFEXP;
  40.                 ptr_mode->page_length =
  41.                                 SPC_MP_INFEXP_PAGE_LENGTH;
  42.                 ptr_mode->mrie =
  43.                                 SPC_MP_INFEXP_MRIE_NO_SENSE;
  44.                 data_sense_lgt += sizeof(struct spc_control_page_info_execpt);
  45.         }
  46.         // Can't send more than mode sense data length
  47.         if (request_lgt > data_sense_lgt)
  48.                 request_lgt = data_sense_lgt;
  49.         if (!udi_msc_cbw_validate(request_lgt, USB_CBW_DIRECTION_IN))
  50.                 return;

  51.         // Fill mode parameter header length
  52.         wp = (mem_wr_protect(udi_msc_cbw.bCBWLUN)) ? SCSI_MS_SBC_WP : 0;

  53.         if (b_sense10) {
  54.                 sense.s10.header.mode_data_length =
  55.                                 cpu_to_be16((data_sense_lgt - 2));
  56.                 //sense.s10.header.medium_type                 = 0;
  57.                 sense.s10.header.device_specific_parameter = wp;
  58.                 //sense.s10.header.block_descriptor_length     = 0;
  59.         } else {
  60.                 sense.s6.header.mode_data_length = data_sense_lgt - 1;
  61.                 //sense.s6.header.medium_type                  = 0;
  62.                 sense.s6.header.device_specific_parameter = wp;
  63.                 //sense.s6.header.block_descriptor_length      = 0;
  64.         }

  65.         // Send mode sense data
  66.         udi_msc_data_send((uint8_t *) & sense, request_lgt);
  67. }


当我运行这个程序的时候,除了驱动自动加以外还虚拟出了个U盘。这让我吃惊不小,看来USB还真得好好学。

以下是WINDOWS自动装完驱动的提示:



以下是我格式化U盘的画面:


最后我建立个TXT文档:

hello hello

存到hello.txt

放到那个虚拟盘上,没想到,顺利打开。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部