中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
作者:
标题: 求 DOS USB 编程 帮助 ! 上一主题 | 下一主题
yuanchengjun
新手上路





积分 8
发帖 3
注册 2007-3-22
状态 离线
『楼 主』:  求 DOS USB 编程 帮助 !

求DOS USB设备 驱动源码,或者例子,或者教程,…… 不用完整的驱动,例子就可以,比如:一次收发数据包过程。


2007-4-17 04:57
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
yuanchengjun
新手上路





积分 8
发帖 3
注册 2007-3-22
状态 离线
『第 2 楼』:  自己顶一下

DOS、C语言不会USB,估计要用汇编。 大侠不吝赐教!


2007-4-17 04:59
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
heling
新手上路





积分 18
发帖 9
注册 2007-6-2
状态 离线
『第 3 楼』:  

请高手赐教


2007-6-7 13:02
查看资料  发短消息  网志   编辑帖子  回复  引用回复
kinglin
初级用户





积分 62
发帖 28
注册 2007-7-3
状态 离线
『第 4 楼』:  

关注ing


2007-7-3 14:33
查看资料  发短消息  网志   编辑帖子  回复  引用回复
windowsvesta
初级用户




积分 138
发帖 67
注册 2007-7-4
来自 云南
状态 离线
『第 5 楼』:  

我也想知道!


2007-7-4 11:04
查看资料  发短消息  网志   编辑帖子  回复  引用回复
johnsonlam
银牌会员

阿林


积分 1410
发帖 497
注册 2004-6-28
来自 九龍,香港
状态 离线
『第 6 楼』:  

有 : www.georgpotthast.de/usb/dosusb.htm 這 是 USB 標 準 文 件 : www.usb.org/developers/docs/us ... [ Last edited by johnsonlam on 2007-7-4 at 01:03 PM ]




我 的 網 站 - optimizr.dyndns.org
2007-7-4 12:59
查看资料  发送邮件  访问主页  发短消息  网志   编辑帖子  回复  引用回复
wzsunlight
初级用户





积分 107
发帖 52
注册 2007-3-10
状态 离线
『第 7 楼』:  

???


2007-9-11 20:15
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
dsysps
初级用户





积分 98
发帖 34
注册 2006-11-3
状态 离线
『第 8 楼』:  

我也想知道,正在努力。现在EHCI的基本配置过程理解了 //通过PCI配置空间检测EHCI BYTE SearchEHCI(void) { union REGS regs; int bus, dev, func; //WORD Did,Vid; WORD ClassCod,SubClass; for(bus = 0; bus <= PDI_BUS_MAX; ++bus) { for(dev = 0; dev <= PDI_DEVICE_MAX; ++dev) { for(func = 0; func <= PDI_FUNCTION_MAX; ++func) { UsbHostPciAddr = MK_PDI(bus, dev, func);/* 计算地址 */ /* 获取厂商ID */ regs.x.ax = 0xB109; // READ CONFIGURATION WORD regs.x.bx = UsbHostPciAddr; regs.x.di = 0; // Vendor ID regs.x.cx = 0xFFFF; // 非法的Vendor ID int86(0x1A, &regs, &regs); /* 判断设备是否存在。FFFFh是非法厂商ID */ if (regs.x.cx != 0xFFFF) { /* Class Code */ regs.x.ax = 0xB109; // READ CONFIGURATION WORD regs.x.bx = UsbHostPciAddr; regs.x.di = 0xA; // Class int86(0x1A, &regs, &regs); ClassCod=regs.x.cx; if(ClassCod==0x0c03) //usb host { regs.x.ax = 0xB109; // READ CONFIGURATION WORD regs.x.bx = UsbHostPciAddr; regs.x.di = 8; //SubClass int86(0x1A, &regs, &regs); SubClass=regs.x.cx; if((SubClass&0xff00)==0x2000) return USB_EHCI_CONTROLLER; } } } } } return USB_NULL_CONTROLLER; } ///*设置基地址为0X000D0000*/ void CfgBaseAddr(void) { union REGS regs; regs.x.ax = 0xB10c; //WRITE CONFIGURATION WORD regs.x.bx = UsbHostPciAddr; regs.x.di = 0X10; regs.x.cx = 0; int86(0x1A, &regs, &regs); regs.x.ax = 0xB10c; // WRITE CONFIGURATION WORD regs.x.bx = UsbHostPciAddr; regs.x.di = 0X12; regs.x.cx = 0X000D; int86(0x1A, &regs, &regs); } .........


2007-10-23 17:15
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
phtsai63
新手上路





积分 6
发帖 3
注册 2007-10-24
状态 离线
『第 9 楼』:  

Dos USB 用 Basic 寫的, 而且只 support OHCI and UHCI. 希望樓上的能造福大眾.


2007-10-24 11:13
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
winson4829
初级用户





积分 58
发帖 17
注册 2008-3-2
状态 离线
『第 10 楼』:  

開發環境使用 DJGPP + FreeDOS + DPMI + DOSUSB 的驅動程式 (www.dosusb.net) 請參考 www.dosusb.net 內的論壇內容, 不同的 USB CHIP 不保證一定成功, 但我的環境下列我寫的 SOURCE CODE 是 OK 的 檔案名稱 : W6USBCOM.h
#ifndef TW6USBCOM_H
#define TW6USBCOM_H

#ifndef BYTE
    #define BYTE    unsigned char
#endif

#ifndef WORD
    #define WORD    unsigned short int
#endif

#ifdef __cplusplus
   extern "C" {
#endif

void 	W6USBComReset(void);
WORD    W6USBComDataIn(void);
int     W6USBComDataOut(char *szData, int nCount);
int     W6USBComGetCoding(void);
int     W6USBComSetCoding(void);
int     W6USBComSetState(void);

#ifdef __cplusplus
   }
#endif

#endif
檔案名稱 : W6USBCOM.C
// --------------------------------------------------------------------
// 1. 需在 autoexec.bat 下啟動 USBDOS.COM
// 2. 設計文件請參考 USBDOS 的 Home Page 或 USBDOS\SAMPLES
// 3. USBDOS.COM 內定 InterruptVector = 0x65
// 4. USBDOS.COM /D 可啟動偵錯模式 (USBDOS.LOG)
// 5. urb.status bit 定義如下 :
// Bit 0: Reserved, 
// Bit 1: Bitstuff error 
// Bit 2: CRC/Timeout 
// Bit 3: NAK
// Bit 4: Babble detected 
// Bit 5: Data Buffer error 
// Bit 6: Stalled
// Bit 7: Active
// Ex.	88 hex means a NAK received, since the active bit is set the data
//      packet can be retried, 44 hex means a CRC/Timeout error which caused a stall.
//      The device may need a reset.
//      The OHCI controller returns different completion codes than the UHCI
//      controller. To simplify driver development, the DOSUSB driver translates the
//      OHCI completion codes to UHCI status codes. However, in the dosusb.log file
//      the OHCI codes are specified.
//      OHCI completion code 1 is translated to 44h, 2 to 42h, 3 to 44h, 4 to 40h,
//      5,6 and 7 to 44h, 8 to 50h, 9 to 00h, 12 to 20h, 13 to A0h and 14 to 88h.
// --------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <signal.h>

#include "USBCom.h"

#define __PACKED__	__attribute__ ((packed))

#define C4USBInterruptVector	0x65

int gnDevAdd		=1;
int gnInEndpoint	=3;
int gnOutEndpoint	=2;

typedef struct
{
	BYTE  transaction_token __PACKED__ ;
	BYTE  chain_end_flag  	__PACKED__ ;
	BYTE  dev_add 			__PACKED__ ;
	BYTE  end_point 		__PACKED__ ;
	BYTE  error_code 		__PACKED__ ;
	BYTE  status 			__PACKED__ ;
	WORD  transaction_flags __PACKED__ ;
	WORD  buffer_off 		__PACKED__ ;  
	WORD  buffer_seg 		__PACKED__ ;  
	WORD  buffer_length 	__PACKED__ ;  
	WORD  actual_length 	__PACKED__ ;  
	WORD  setup_buffer_off 	__PACKED__ ; 
	WORD  setup_buffer_seg 	__PACKED__ ; 
	WORD  start_frame 		__PACKED__ ;  
	WORD  nr_of_packets 	__PACKED__ ;  
	BYTE  int_interval 		__PACKED__ ;  
	BYTE  error_count 		__PACKED__ ;  
	WORD  timeout 			__PACKED__ ;  
	WORD  next_urb_off 		__PACKED__ ;  
	WORD  next_urb_seg 		__PACKED__ ;  
} TURBType;

typedef struct
{
	BYTE bmRequestType	__PACKED__; 
	BYTE bRequest		__PACKED__; 
	WORD wValue			__PACKED__; 
	WORD wIndex			__PACKED__; 
	WORD wLength		__PACKED__; 
}  TDeviceRequest;

char	gszUSBDataIn[1025];

//*************************************************************************************************
int main(int argc, char *argv[])
{
    #ifndef ALLEGRO_MINGW32
	    int     i, n, k;
	    int     nInEndpoint;
	    char	szData[128];

		if(!__djgpp_nearptr_enable()) 
		{
			printf("!__djgpp_nearptr_enable()");
			return(0);
		}		
	    
	    if(W6USBComSetCoding()!=0) 	return(0);
	    if(W6USBComGetCoding()!=0) 	return(0);
	    if(W6USBComSetState()!=0) 	return(0);

	    printf("Simple TTY-Terminal at 38.400 baud - press ESC to exit\n");

	    nInEndpoint   	= gnInEndpoint;
	    gnInEndpoint  	= 1;
	    if( (n= W6USBComDataIn())>0 )
	    {
		    printf("Line status in hex: \n");
		    for(i=0;i<2;i++)
		    {
		        printf("%.2X ",gszUSBDataIn[i]);
		    }
	    }	    
	    gnInEndpoint=nInEndpoint;

	    for(k=0;k<30;k++)
	    {
	        // 接收內容
	        if((n=W6USBComDataIn())>0)
	        {
	            printf("urb.actual_length = %d\n", n);
	            for(i=0;i<n;i++) printf("%c", gszUSBDataIn[i]);
	            printf("\n");
	        }

			szData[0] = 'A';
			szData[1] = 0x00;
	        W6USBComDataOut(szData,1);          // 送出 'A'
	        delay(1000);
	    }
	#else
		return(0);
    #endif
}


// *************************************************************************************************
WORD W6USBComDataIn()
{
    #ifndef ALLEGRO_MINGW32
		__dpmi_regs  	regs;
		TURBType		urb;
	        
	    // set up in request
	    urb.transaction_token	=0x69;
	    urb.chain_end_flag		=0;
	    urb.dev_add				=gnDevAdd;
	    urb.end_point			=gnInEndpoint;
	    urb.error_code			=0;
	    urb.status				=0;
	    urb.transaction_flags	=0;
	    urb.buffer_seg			=(__tb+64) >> 4;			// __tb 定義在 go32.h 為一個1024K內實體記錄位址
	    urb.buffer_off			=(__tb+64) &  0x0F;
	    urb.buffer_length		=64;
	    urb.actual_length		=64;
	    urb.setup_buffer_off	=0;
	    urb.setup_buffer_seg	=0;
	    urb.start_frame			=0;
	    urb.nr_of_packets		=0;
	    urb.int_interval		=0;
	    urb.error_count			=0;
	    urb.timeout				=0;
	    urb.next_urb_off		=0;
	    urb.next_urb_seg		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);

	    // registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
	    regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
	    __dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI

		// 將 __tb 回傳的資料填到 urb
	    dosmemget (__tb, sizeof(urb), (char *)&urb);  

		// invalid device address?
		if (urb.error_code==1) 	return(0);

		// transaction error?
		if(urb.status > 1)		return(0);		

		// 將 __tb 回傳的資料填到 gszUSBDataIn
		if(urb.actual_length>0) dosmemget (__tb+64, urb.actual_length, gszUSBDataIn); 

		return(urb.actual_length);
	#else
		return(0);
    #endif
}

// 0 : success
// 1 : Invalid device address
// 2 : transaction error?
int W6USBComDataOut(char *szData, int nCount)
{
    #ifndef ALLEGRO_MINGW32
		__dpmi_regs 	regs;
		TURBType		urb;
		char			szTmp[128];

		// 把 szData 的資料指定到 __tb+64 位置
		if(nCount==0) nCount=strlen(szData);
		if(nCount==0) return(0);


		dosmemput(szData, nCount, __tb+64);
		
		// outputs data in buffer
		// set up out request
		urb.transaction_token	=0xE1;
		urb.chain_end_flag		=0;
		urb.dev_add				=gnDevAdd;
		urb.end_point			=gnOutEndpoint;
		urb.error_code			=0;
		urb.status				=0;
		urb.transaction_flags	=0;
	    urb.buffer_seg			=(__tb+64) >> 4;			// __tb 定義在 go32.h 為一個1024K內實體記錄位址
	    urb.buffer_off			=(__tb+64) &  0x0F;
		urb.buffer_length		=nCount;
		urb.actual_length		=64;
		urb.setup_buffer_off	=0;
		urb.setup_buffer_seg	=0;
		urb.start_frame			=0;
		urb.nr_of_packets		=0;
		urb.int_interval		=0;
		urb.error_count			=0;
		urb.timeout				=0;
		urb.next_urb_off		=0;
		urb.next_urb_seg		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);

	    // registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
	    regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
	    __dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI

		// 將 __tb 回傳的資料填到 urb
	    dosmemget (__tb, sizeof(urb), (char *)&urb);  

		// invalid device address?
		if (urb.error_code==1) 	return(urb.error_code);

		// transaction error?
		if(urb.status > 1)		return(urb.status);

	    return(0);
	#else
		return(0);
    #endif
}

// 0 : success
// 1 : Invalid device address
// 2 : transaction error?
int W6USBComGetCoding()
{
    #ifndef ALLEGRO_MINGW32
		__dpmi_regs  	regs;
		TDeviceRequest	device_request;
		TURBType		urb;

		device_request.bmRequestType=0xA1;
		device_request.bRequest		=0x21;
		device_request.wValue		=0x00;
		device_request.wIndex		=0;
		device_request.wLength		=0x7;

		// 把 device_request 的資料指定到 __tb+128 位置
		dosmemput((char *)&device_request, sizeof(device_request), __tb+128);

		// set up get Line Coding request
		urb.transaction_token	=0x2D;
		urb.chain_end_flag		=0;
		urb.dev_add				=gnDevAdd;
		urb.end_point			=0;
		urb.error_code			=0;
		urb.status				=0;
		urb.transaction_flags	=0;
	    urb.buffer_seg			=(__tb+64) >> 4;			// __tb 定義在 go32.h 為一個1024K內實體記錄位址
	    urb.buffer_off			=(__tb+64) &  0x0F;
		urb.buffer_length		=18;
		urb.actual_length		=64;
		urb.setup_buffer_seg	=(__tb+128) >> 4;			// device_request segment
		urb.setup_buffer_off	=(__tb+128) &  0x0F;		// device_request offset
		urb.start_frame			=0;
		urb.nr_of_packets		=0;
		urb.int_interval		=0;
		urb.error_count			=0;
		urb.timeout				=0;
		urb.next_urb_seg		=0;
		urb.next_urb_off		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);	

	    // registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
	    regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
	    __dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI

		// 將 __tb 回傳的資料填到 urb
	    dosmemget (__tb, sizeof(urb), (char *)&urb);  
		
		// invalid device address?
		if (urb.error_code==1) 	return(urb.error_code);

		// transaction error?
		if(urb.status > 1)		return(urb.status);

	    return(0);
	#else
		return(0);
    #endif

}

// 0 : success
// 1 : Invalid device address
// 2 : transaction error?
int W6USBComSetCoding()
{
    #ifndef ALLEGRO_MINGW32
		__dpmi_regs  	regs;
	    int 			nInEndpoint;
	    int 			nOutEndpoint;
	    char			szData[128];
	    int				nDataLen;
		TDeviceRequest  device_request;
		TURBType		urb;    
	        
		device_request.bmRequestType=0x21;
		device_request.bRequest	=0x20;
		device_request.wValue	=0x00;
		device_request.wIndex	=0;
		device_request.wLength	=0x7;

		// 把 device_request 的資料指定到 __tb+128 位置
		dosmemput((char *)&device_request, sizeof(device_request), __tb+128);

		// set up get Line Coding request
		urb.transaction_token	=0x2D;
		urb.chain_end_flag		=0;
		urb.dev_add				=gnDevAdd;
		urb.end_point			=0;
		urb.error_code			=0;
		urb.status				=0;
		urb.transaction_flags	=0;
		urb.buffer_seg			=0; //varseg(buffer)
		urb.buffer_off			=0; //varptr(buffer)
		urb.buffer_length		=0;
		urb.actual_length		=0;
		urb.setup_buffer_seg	=(__tb+128) >> 4;			// device_request segment
		urb.setup_buffer_off	=(__tb+128) &  0x0F;		// device_request offset
		urb.start_frame			=0;
		urb.nr_of_packets		=0;
		urb.int_interval		=0;
		urb.error_count			=0;
		urb.timeout				=0;
		urb.next_urb_seg		=0;
		urb.next_urb_off		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);
		
		// registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
	    regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
		__dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI

		// 將 __tb 回傳的資料填到 urb
	    dosmemget (__tb, sizeof(urb), (char *)&urb);  

		// invalid device address?
		if (urb.error_code==1) 	return(urb.error_code);

		// transaction error?
		if(urb.status > 1)		return(urb.status);

		// now send line coding structure - 38400 baud 8-N-1
		nInEndpoint = gnInEndpoint;
		nOutEndpoint= gnOutEndpoint;
		// 0x1C200	=115200
		// 0xE100	=57600
		// 0x9600	=38400
		// 0x4B00	=19200
		// 0x2580	=9600
		// 0x12C0	=4800
		// 0x0960	=2400
		// 0x04B0	=1200
		// --> chr$(0x00)+chr$(0x96) = 0x9600 (little endian) = 38400 baud
		// --> chr$(8) = 8bit
		szData[0] 		= 0x00;
		szData[1] 		= 0x96;
		szData[2] 		= 0x00;
		szData[3] 		= 0x00;
		szData[4] 		= 0x00;
		szData[5] 		= 0x00;
		szData[6] 		= 0x08;
		nDataLen		= 7;

		gnOutEndpoint 	= 0;
		W6USBComDataOut(szData, nDataLen);

		gnInEndpoint	= 0;
		W6USBComDataIn();

		gnInEndpoint    = nInEndpoint;
		gnOutEndpoint   = nOutEndpoint;

		return(0);
	#else
		return(0);
    #endif
}

// 0 : success
// 1 : Invalid device address
// 2 : transaction error?
int W6USBComSetState()
{
    #ifndef ALLEGRO_MINGW32
        __dpmi_regs  	regs;
		TDeviceRequest  device_request;
		TURBType		urb;
    
		device_request.bmRequestType=0x21;
		device_request.bRequest		=0x22;
		device_request.wValue		=0x03;
		device_request.wIndex		=0;
		device_request.wLength		=0x00

		// 把 device_request 的資料指定到 __tb+128 位置
		dosmemput((char *)&device_request, sizeof(device_request), __tb+128);

		// set up request
		urb.transaction_token	=0x2D;
		urb.chain_end_flag		=0;
		urb.dev_add				=gnDevAdd;
		urb.end_point			=0;
		urb.error_code			=0;
		urb.status				=0;
		urb.transaction_flags	=0;
		urb.buffer_seg			=(__tb+64) >> 4;
		urb.buffer_off			=(__tb+64) &  0x0F;
		urb.buffer_length		=0;
		urb.actual_length		=0;
		urb.setup_buffer_seg	=(__tb+128) >> 4;			// device_request segment
		urb.setup_buffer_off	=(__tb+128) &  0x0F;		// device_request offset
		urb.start_frame			=0;
		urb.nr_of_packets		=0;
		urb.int_interval		=0;
		urb.error_count			=0;
		urb.timeout				=0;
		urb.next_urb_seg		=0;
		urb.next_urb_off		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);
	
		// registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
    	regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
		__dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI

		// 將 __tb 回傳的資料填到 urb
    	dosmemget (__tb, sizeof(urb), (char *)&urb);  

		// invalid device address?
		if (urb.error_code==1) 	return(urb.error_code);

		// transaction error?
		if(urb.status > 1)		return(urb.status);

		// success
		return(0);
	#else
		return(0);
    #endif

}

void W6USBComReset()
{
    #ifndef ALLEGRO_MINGW32
        __dpmi_regs  	regs;
		TURBType		urb;
    
		// set up request
		urb.transaction_token	=0xFF;						// 0xFF 為 Reset token (參考 USBDOS.htm)
		urb.chain_end_flag		=0;
		urb.dev_add				=gnDevAdd;					// 0 : 表全部
		urb.end_point			=0;
		urb.error_code			=0;
		urb.status				=0;
		urb.transaction_flags	=0;
		urb.buffer_seg			=0;
		urb.buffer_off			=0;
		urb.buffer_length		=0;
		urb.actual_length		=0;
		urb.setup_buffer_seg	=0;		
		urb.setup_buffer_off	=0;		
		urb.start_frame			=0;
		urb.nr_of_packets		=0;
		urb.int_interval		=0;
		urb.error_count			=0;
		urb.timeout				=0;
		urb.next_urb_seg		=0;
		urb.next_urb_off		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);
		
		// registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
		regs.x.ax = 1;										// 1 : Reset command (USBDOS.HTM)
    	regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
		__dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI
    #endif
}


int W6USBComDeviceDescriptor()
{
    #ifndef ALLEGRO_MINGW32
        __dpmi_regs  	regs;
		TDeviceRequest  device_request;
		TURBType		urb;
    
		device_request.bmRequestType	= 0x80;
		device_request.bRequest 		= 6;
		device_request.wValue 			= 0x100;
		device_request.wIndex 			= 0;
		device_request.wLength 			= 8;

		// 把 device_request 的資料指定到 __tb+128 位置
		dosmemput((char *)&device_request, sizeof(device_request), __tb+128);

		// set up request
		urb.transaction_token	=0x2D;
		urb.chain_end_flag		=0;
		urb.dev_add				=gnDevAdd;
		urb.end_point			=0;
		urb.error_code			=0;
		urb.status				=0;
		urb.transaction_flags	=0;
		urb.buffer_seg			=(__tb+64) >> 4;
		urb.buffer_off			=(__tb+64) &  0x0F;
		urb.buffer_length		=8;
		urb.actual_length		=8;
		urb.setup_buffer_seg	=(__tb+128) >> 4;			// device_request segment
		urb.setup_buffer_off	=(__tb+128) &  0x0F;		// device_request offset
		urb.start_frame			=0;
		urb.nr_of_packets		=0;
		urb.int_interval		=0;
		urb.error_count			=0;
		urb.timeout				=0;
		urb.next_urb_seg		=0;
		urb.next_urb_off		=0;

		// 將 urb 填入 __tb
		dosmemput((char *)&urb, sizeof(urb), __tb);
	
		// registor : Flags = 0: AX = 1: BX = 2: CX = 3: DX = 4: SI = 5: DI = 6 BP = 7: DS = 8: ES = 9
    	regs.x.ds = __tb >> 4;
	    regs.x.dx = __tb &  0x0F;
		__dpmi_int (C4USBInterruptVector, &regs);           // call DosUHCI

		// 將 __tb 回傳的資料填到 urb
    	dosmemget (__tb, sizeof(urb), (char *)&urb);  

		// invalid device address?
		if (urb.error_code==1) 	return(urb.error_code);

		// transaction error?
		if(urb.status > 1)		return(urb.status);

		// 將 __tb 回傳的資料填到 gszUSBDataIn
		if(urb.actual_length>0) dosmemget (__tb+64, urb.actual_length, gszUSBDataIn); 

		// 會回應 8 個 BYTES
		printf("\n\nDevice Descriptor:");
		printf("\nLength:                %d",			gszUSBDataIn[0]);
		printf("\nDescriptor type:       %d",			gszUSBDataIn[1]);
		printf("\nUSB specification nr.: %02X%02X hex",	gszUSBDataIn[3],gszUSBDataIn[2]);
		printf("\nClass code:            %d",			gszUSBDataIn[4]);
		printf("\nSubclass code:         %d",			gszUSBDataIn[5]);
		printf("\nProtocol code:         %d",			gszUSBDataIn[6]);
		printf("\nMax Packet size:       %d\n",			gszUSBDataIn[7]);
	
		// success
		return(0);
	#else
		return(0);
    #endif
}


2008-3-6 14:34
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
happe
新手上路





积分 12
发帖 6
注册 2008-3-11
状态 离线
『第 11 楼』:  

还在学习 这里的东西太多了... DOS USB 编程是怎么回事? 看了还是不明白




2008-3-11 05:01
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: