Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2014回复:4

在用自编的程序下载Hex文件到EZUSB芯片(AN2131QC)时的问题

楼主#
更多 发布于:2002-05-02 15:27
下面的一段节选自 Cypress公司ezusb开发套件中的 EZ-USB General Purpose Driver Specification.pdf 一文,有几个疑点百思不得其解。

========================================================================
5.4 EZ-USB Specific IOCTLs
5.4.1 IOCTL_Ezusb_ANCHOR_DOWNLOAD
  Downloads data to EZ-USB RAM starting at address 0.
 
  dwIoControlCode IOCTL_Ezusb_ANCHOR_DOWNLOAD
  lpInBuffer Buffer of data to download to EZ-USB RAM
  nInBufferSize Size of the download buffer. Must be <= 7KB.
  lpOutBuffer NULL
  nOutBufferSize 0

5.4.2 IOCTL_EZUSB_ANCHOR_DOWNLOAD
  Downloads data to EZ-USB RAM starting at the specified address. This IOCTL will only download to the EZ-USB’s internal RAM.

  dwIoControlCode IOCTL_EZUSB_ANCHOR_DOWNLOAD
  lpInBuffer Pointer to an ANCHOR_DOWNLOAD_CONTROL structure.
   typedef struct _ANCHOR_DOWNLOAD_CONTROL
   {
   WORD Offset;
   } ANCHOR_DOWNLOAD_CONTROL, *PANCHOR_DOWNLOAD_CONTROL;
   Offset pecifies the offset within EZ-USB RAM to download to.
  nInBufferSize sizeof(ANCHOR_DOWNLOAD_CONTROL)
  lpOutBuffer Buffer of data to download to EZ-USB RAM
  nOutBufferSize size of the output buffer.

  This parameter determines the size of the Anchor Download.
========================================================================

(1)IOCTL_Ezusb_ANCHOR_DOWNLOAD 与 IOCTL_EZUSB_ANCHOR_DOWNLOAD 的区别?
(2)我认为,windows API 函数 DeviceIoControl 的 lpOutBuffer 参数是指向PC接收到设备发来的数据的,但在上文5.4.2所说是“Buffer of data to download to EZ-USB RAM”,怎么理解?
(3)我已将我的程序 MY.A51 编译成 MY.HEX,用“记事本”打开内容如下:
:03000000020200F9
:1002000075815F907F947400F0907F9D74FFF0740F
:1002100003F4907F97F051355135513551355135B3
:100220002380EF7FFA000000000000DFF8227E0A42
:100230005123DEFC227E645123DEFC2251355135F0
:0E024000513551355135227D0A5135DDFC22F4
:00000001FF
而在 Cypress的 control panel 程序里显示如下:
0000 75 81 5F 90 7F 94 74 00 F0 90 7F 9D 74 FF F0 74
0010 03 F4 90 7F 97 F0 51 35 51 35 51 35 51 35 51 35
0020 23 80 EF 7F FA 00 00 00 00 00 00 DF F8 22 7E 0A
0030 51 23 DE FC 22 7E 64 51 23 DE FC 22 51 35 51 35
0040 51 35 51 35 51 35 22 7D 0A 51 35 DD FC 22
请问,我将以何种转换方式将我的MY.HEX文件内容放到 lpInBuffer 变量里去,能否给出用Delphi/VB源程序?我参照Cypress的C:\\Cypress\\USB\\Examples\\EzUsb\\bulktest\\host\\main.c文件改写得Delphi代码,总是下载失败,而用 Cypress的 control panel 下载正常,不知错在何处,请指教? 另 C/C++语言里fopen、fread函数用法如何?


==========我的Delphi程序================================================
procedure TForm1.Button5Click(Sender: TObject);
// DownLoad HexFile to EZUSB.
const
  MAX_FILE_SIZE = (1024 * 7);
var
  hDevice: THandle;     bResult: Boolean;    nBytes: DWORD;
  F: File;    NumRead: integer;    
  Buffer: array[1..MAX_FILE_SIZE] of char;  
  DownloadFilename: string;
  S: string;  ii: integer;
begin
  hDevice:= OpenDriver;
  if (not bDevHandleValid(hDevice)) then
  begin
    showmessage(\'打开设备时出错!\');
    hDevice := 0;
    exit;
  end;
  if OpenDialog1.Execute then
  begin
    AssignFile(F, OpenDialog1.FileName);
    FileMode := 0;     // Set file access to read only
    Reset(F,1);       // Record size = 1
    BlockRead( F, buffer, SizeOf(buffer), NumRead);
    s:= format(\'Anchor Download %d bytes\',[NumRead]);
    showmessage(S);
    CloseFile(F);
  end;
  bResult := DeviceIoControl (hDevice,
    IOCTL_Ezusb_ANCHOR_DOWNLOAD,
    @buffer,
    NumRead,
    nil,
    0,
    nBytes,
    nil);
  if(not bResult) then Memo1.Lines.Add(\'Anchor 固件下载失败\');
  CloseHandle (hDevice);
end;
========================================================================


==========Cypress 的程序段==============================================
            #define MAX_FILE_SIZE (1024*7)
            char DownloadFilename[256];
            FILE *fp;
            unsigned char buffer[MAX_FILE_SIZE];
            int numread = 0;
            char                   temp[64]  = \"\";
            hOutputBox = GetDlgItem (hDlg, IDC_OUTPUT_BOX);
            MAINTAIN_OUTPUT_BOX (hOutputBox, nItems);
            // Get the text in the driver name edit box
            GetDlgItemText (hDlg, IDC_DOWNLOAD_FILENAME, DownloadFilename, 256);
            if ((fp = fopen(DownloadFilename,\"rb\")) != NULL)
            {
               numread = fread(buffer,sizeof(unsigned char),MAX_FILE_SIZE,fp);
               wsprintf (temp, \"Anchor Download %d bytes\",numread);
               SendMessage (hOutputBox, LB_ADDSTRING, 0, (LPARAM)temp);
               if (IsDlgButtonChecked(hDlg,IDC_VERBOSE) == BST_CHECKED)
                DumpBuffer(buffer,80,hOutputBox);
               fclose(fp);
            }
            // Get the text in the driver name edit box
            GetDlgItemText (hDlg, IDC_DRIVER_NAME, pcDriverName, MAX_DRIVER_NAME);
             // Open the driver
             if (bOpenDriver (&hDevice, pcDriverName) == TRUE) {
                SendMessage (hOutputBox, LB_ADDSTRING, 0, (LPARAM)\"Opened Driver Successfully\");
             } else {
                SendMessage (hOutputBox, LB_ADDSTRING, 0, (LPARAM)\"Failed to Open Driver\");
                hDevice = NULL;
             }/* else */
             if (hDevice != NULL) {
                bResult = DeviceIoControl (hDevice,
                   IOCTL_Ezusb_ANCHOR_DOWNLOAD,
                   buffer,
                   numread,
                   NULL,
                   0,
                   &nBytes,
                   NULL);
             }/* if valid driver handle */
             if (bResult==TRUE)
             {
                // do nothin
             }
             else
                SendMessage (hOutputBox, LB_ADDSTRING, 0, (LPARAM)\"Anchor Download failed\");
             // Close the handle
             CloseHandle (hDevice);
========================================================================
 

最新喜欢:

sunmaculasunmac...
u_you
驱动中牛
驱动中牛
  • 注册日期2002-04-11
  • 最后登录2010-03-05
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-02 23:12
我想你应了解HEX格式先。
狼,食肉目犬科犬属。外形和狼狗相似。 有狗的忠诚,但无狗的奴性。 [img]http://www.driverdevelop.com/forum/avatar/u_you_wolf.jpg[/img]
Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-03 14:11
问题最终可以归结为:
  C语言里的函数(文件?) fopen 与 fread 的使用方法,以及如何理解下面二行C程序并将其转换为Delphi程序的问题。
//=========== C ===============
FILE *fp;
unsigned char buffer[MAX_FILE_SIZE];
int numread = 0;

if ((fp = fopen(DownloadFilename,\"rb\")) != NULL)
{
numread = fread(buffer,sizeof(unsigned char),MAX_FILE_SIZE,fp);
}
  
  我在Delphi里用以下函数翻译C里的“fread”,但总出错,buffer里结果不对,有请高手指教!
//=========== Delphi ===============
BlockRead( F, buffer, SizeOf(buffer), NumRead);
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-03 16:57
DELPHI是好久没用的东西了.
Delphi可以自由使用WIN32 API的. 你使用CREATEFILE, READFILE就是.

C的RUNTIME 函数和WIN32 API在 NTDLL层上是同一个实装.

如果你确信CRUNTIME 可以成功, 那么READFILE(EX)也就百分之百成功.
Leonwe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2005-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-11 20:27
    我正在开发的基于USB接口的测试设备,PC应用程序利用delphi编程,由于延续性问题,现无法更改用VC/VB等编程。但现在CYpress提供的他的控制面板程序的源程序及其它上位机例子程序给出的都是VC或VB代码,我从未系统学过C/C++,这些天我一直在试图理解C++代码并翻译到Delphi,尽管已经认为基本读懂范例中的代码,但我的Delphi程序在通过调用DeviceIoControl实现下载Bix文件、Bulk传输输入输出数据时总是失败。因项目开发时间关系,现非常需要大家的帮助,哪位仁兄精通EZUSB(AN2131)和Delphi的人,帮我的delphi源代码调试通?
    先致以真诚的谢意!
 
<1>.在我的Delphi5应用程序中,获取设备描述符、配置描述符、接口管道信息 都已经非常正确,
但下载 Bix 文件(到AN2131里去)却始终不能成功;
<2>.已有一个经“Cypress控制面板程序”验证能正常Bulk输入输出的Bix 文件,
在我自己的Delphi5应用程序中不能成功。
    以上2问题在调试跟踪时,DeviceIoControl 函数总是返回False,是否此函数的参数我送的不对?
 
我的程序段(Delphi 5)如下:
 
procedure TForm1.BtnDownloadClick(Sender: TObject); // 下载 Bix 文件到AN2131里去
const
  MAX_FILE_SIZE = (1024*7);
var
  hDevice: THandle;  bResult: Boolean;  nBytes: Longword;
  F: file;  wFileSize,NumRead: LongWord ;
  Buffer: array[1..MAX_FILE_SIZE] of Byte;
  DownloadFilename: string;
begin
  if not(bOpenDriver(hDevice, pcDriverName)) then exit;  // hDevice:取得的设备的句柄
  if OpenDialog1.Execute then
  begin
    AssignFile(F, OpenDialog1.FileName);
    FileMode := 0;   // Set file access to read only
    Reset(F,1);      // Record size = 1
    wFileSize:= FileSize(F);  // 获取文件长度
    BlockRead( F, Buffer, wFileSize, NumRead );
    CloseFile(F);
  end;               // end of OpenDialog1.Execute
 
  bResult := DeviceIoControl (hDevice,
    IOCTL_Ezusb_ANCHOR_DOWNLOAD,  // ???????????????????????? 这个IOCTL 应该没错的
    @buffer,       // 包含文件内容(字节)的缓冲区的指针,????????????错了么?
    numread,       // 缓冲区的长度,??????????????????????????????????错了么?
    nil,
    0,
    nBytes,
    nil);
  // 为什么 DeviceIoControl 函数总是返回False ????????????????????????????????????
  if(not bResult) then showmessage(\'Anchor 固件下载失败\');
  CloseHandle (hDevice);
end;
 

// ★★★★★★★★★★★★★★★★★★★★
 
procedure TForm1.BtnBulk1Click(Sender: TObject);
// Bulk传输,将文本框Edit2里的字符内容,通过端点2OUT送到AN2131里去
type
  _BulkBuffer = array[0..63] of char;
  pBulkBuffer = ^_BulkBuffer;
var
  sTmp:string; iTmp:integer;
  pipeID: ULONG;
  Buffer: pBulkBuffer;
  Size: Byte;
  dataLen: DWORD;
  InterfaceInfo:USBD_INTERFACE_INFORMATION;
  ioctl_val:DWORD;
  bulkControl:BULK_TRANSFER_CONTROL;
  nBytes: DWORD;
  bResult: Boolean;
begin
  if not(bOpenDriver(hDevice, pcDriverName)) then exit;
  Size := Edit2.GetTextLen;
  Inc(Size);
  GetMem(Buffer, Size);           // 申请内存
  Edit2.GetTextBuf(Buffer^,Size); // 将文本框Edit2的字符内容送到Buffer所指的内存区域
  dataLen:= Size;                 //
  pipeID := 2;                    // 选择第 2 号管道,Endpoint 2 OUT,BULK模式
  bulkControl.pipeNum:= pipeID;
 
  bResult := GetInterfaceInfo(hDevice, InterfaceInfo, nBytes);
  if (not bResult) then showmessage(\'获取接口信息出错\');
  If (InterfaceInfo.Pipes[pipeID].EndpointAddress > 128) Then
    ioctl_val:= IOCTL_EZUSB_BULK_READ      // 读
  else
    ioctl_val:= IOCTL_EZUSB_BULK_WRITE;    // 写
  nBytes:= 0;
 
  bResult := DeviceIoControl(hDevice,
    ioctl_val,
    @bulkControl,                   // 指向 BULK_TRANSFER_CONTROL 结构的指针
    Sizeof(BULK_TRANSFER_CONTROL),  // BULK_TRANSFER_CONTROL 结构的长度
    Buffer,                         // 指向Bulk传输(收/发)缓冲区的指针,????????????错了么?
    dataLen,                        // 缓冲区长度,?????????????????????????????????错了么?
    nBytes,                         //
    0);
  if(not bResult) then showmessage(\'Bulk传输失败\');
  // 为什么 DeviceIoControl 函数总是返回False ????????????????????????????????????
 
  CloseHandle (hDevice);            // 关设备
  FreeMem(Buffer);                  // 释放内存
end;
游客

返回顶部