阅读:1337回复:6
请问斑竹关于固件的几个问题,恳请解答!
在<<D12固件编程指南>>中我有如下问题不理解,恳请斑竹解答!
void single_transmit(unsigned char * buf, unsigned char len) //* buf,len在实际问题中应根据什么确定?在后面会给出不懂的实例 { if( len <= EP0_PACKET_SIZE) { D12_WriteEndpoint(1, len, buf); //如何确定向那个端点写数据? buf怎么确定? } } // USB standard device requests void get_status(void) { unsigned char endp, txdat[2]; //txdat[]代表什么?里面的值由什么确定? unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; unsigned char c; if (bRecipient == USB_RECIPIENT_DEVICE) { if(bEPPflags.bits.remote_wakeup == 1) txdat[0] = 3; else txdat[0] = 1; txdat[1]=0; //txdat[?]=?,怎么确定的? single_transmit(txdat, 2); //表示什么意思? } else if (bRecipient == USB_RECIPIENT_INTERFACE) { txdat[0]=0; txdat[1]=0; //??? single_transmit(txdat, 2); //??? } else if (bRecipient == USB_RECIPIENT_ENDPOINT) { endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */ //??? else c = D12_SelectEndpoint(endp*2); /* Control-out */ //根据什么来确定的??? if(c & D12_STALL) txdat[0] = 1; else txdat[0] = 0; txdat[1] = 0; single_transmit(txdat, 2); //??? } else stall_ep0(); //什么时候用stall_ep0(); } |
|
最新喜欢:![]() |
沙发#
发布于:2002-12-10 09:23
chengjian_hui 回答第四个窗口的问题道:
ep_last = D12_ReadLastTransactionStatus(0),因为这是中断子程序,响应中断后就要清中断标志位,以便响应下次中断。以下的部分是上位机与固件之间建立连接,以获取设备描述符的部分,所有的USB设备都要这样写的,说实话,本人也不太清楚。 建议这位仁兄关注一下具体的应用程序部分(主要在ep2_rxdone()和ep2_txdone()里。 但是在指南上关于这部分写的非常简略。就只在Isr。C中: void main_txone(void) { } void main_rxone(void) { } 在编写具体应用程序是应注意哪些呢?敬请指教!!! 对程序ep1_txdone和ep1_rxdone比较熟悉的高手可否大致的讲解一下?我将不胜感激!!! |
|
板凳#
发布于:2002-12-10 09:20
谢谢chengjian_hui,非常感激!已经给分了.
下面还是有些问题不懂: txdat[]的值取决于和上位机的通信协议,返回什么值是由自己决定的。能就下面的程序说明一下它们的值是如何确定的吗? if (bRecipient == USB_RECIPIENT_DEVICE) { if(bEPPflags.bits.remote_wakeup == 1) txdat[0] = 3;//??? else txdat[0] = 1; txdat[1]=0;//??? single_transmit(txdat, 2); single_transmit(txdat, 2)的意思就是向端点一写txdat里的两个字节。??? single_transmit都是向端点1写数据吗? c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */ //??? else c = D12_SelectEndpoint(endp*2); /* Control-out */ //根据什么来确定的??? stall_ep0(); ?是不是在遇到unsupported command是才用? 什么时候需要用到init_config 和init_unconfig?void get_interface(void) { unsigned char txdat = 0; /* Only/Current interface = 0 */ //为什么txdat = 0,就有Only/Current interface = 0 single_transmit(&txdat, 1); //??? } 下面一段程序有请哪位高手指点一下 unsigned char D12_ReadMainEndpoint(unsigned char * buf) { unsigned char i, j, k = 0, bDblBuf = 1; // bDblBuf = 1??? if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND, 0x84); //0x84代表什么?如何确定? if( (inportb(D12_DATA) & 0x60) == 0x60) //0x60代表什么?如何确定? bDblBuf = 2; // bDblBuf = 2;??? while(bDblBuf) { outportb(D12_COMMAND, 4); //4代表什么?是不是端点2输出? if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) break; outportb(D12_COMMAND, 0xF0); //是读还是写缓冲区?这里老是混淆了 //手册上的数据流命令中04h表示端点2输出,它是指数据从主机到端点输出还是相反?我老是搞混淆了,//敬请指教!!! j = inportb(D12_DATA); j = inportb(D12_DATA); for(i=0; i<j; i++) *(buf+i+k) = inportb(D12_DATA); //???干什么?有什么作用? k += j; //??? outportb(D12_COMMAND, 0xF2); bDblBuf --; //??? } if(bEPPflags.bits.in_isr == 0) ENABLE; return k; } |
|
地板#
发布于:2002-12-09 20:41
回答第一个窗口的问题:
buf ,len是由自己决定的,buf是所要发送数据的指针,len是所要发送数据的长度。D12_WriteEndpoint(1, len, buf)中的“1”就是向端点1写数据。 txdat[]的值取决于和上位机的通信协议,返回什么值是由自己决定的。single_transmit(txdat, 2)的意思就是向端点一写txdat里的两个字节。 回答第二个窗口的问题: 我以为0xff00,0xfe00是由硬件决定的,XBYTE是对外部地址总线的寻址。if( ) disable;if() enable是判断中断标志位,来决定禁止或使能中断的。 回答第三个窗口的问题: D12_ReadLastTransactionStatus(3)中的3是端点3的意思,对端口1的发送是通过端点3发的(在D12说明里有说明的)。 回答第四个窗口的问题: ep_last = D12_ReadLastTransactionStatus(0),因为这是中断子程序,响应中断后就要清中断标志位,以便响应下次中断。以下的部分是上位机与固件之间建立连接,以获取设备描述符的部分,所有的USB设备都要这样写的,说实话,本人也不太清楚。 建议这位仁兄关注一下具体的应用程序部分(主要在ep2_rxdone()和ep2_txdone()里。 水平有限,回答至此,还请多多包涵。 |
|
地下室#
发布于:2002-12-09 18:58
void ep0_rxdone(void)
{ unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag //??为什么清除了终端标志 if (ep_last & D12_SETUPPACKET) { ControlData.wLength = 0; ControlData.wCount = 0; //wcount指什么? if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) { D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); //是让端点0,1中止吗?why? bEPPflags.bits.control_state = USB_IDLE; return; } ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength); // Acknowledge setup here to unlock in/out endp //??? D12_AcknowledgeEndpoint(0); D12_AcknowledgeEndpoint(1); ControlData.wLength = ControlData.DeviceRequest.wLength; ControlData.wCount = 0; //??? if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; /* get command */ } else { if (ControlData.DeviceRequest.wLength == 0) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; /* set command */ } else { if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) { bEPPflags.bits.control_state = USB_IDLE; D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); } else { bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */ } } // set command with data } // else set command } // if setup packet else if (bEPPflags.bits.control_state == USB_RECEIVE) { i = D12_ReadEndpoint(0, EP0_PACKET_SIZE, ControlData.dataBuffer + ControlData.wCount); ControlData.wCount += i; if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; } } else { bEPPflags.bits.control_state = USB_IDLE; } } 这一打断程序的思路我都不清晰,恳请高手指点!!!不胜感激!!! |
|
5楼#
发布于:2002-12-09 18:49
有请高手帮忙看一下,这段程序看不懂
// D12_ReadMainEndpoint() added by V2.2 to support double-buffering. // Caller should assume maxium 128 bytes of returned data. unsigned char D12_ReadMainEndpoint(unsigned char * buf) { unsigned char i, j, k = 0, bDblBuf = 1; if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND, 0x84); //0x84代表什么?如何确定? if( (inportb(D12_DATA) & 0x60) == 0x60) //0x60代表什么?如何确定? bDblBuf = 2; while(bDblBuf) { outportb(D12_COMMAND, 4); //4代表什么? if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) break; outportb(D12_COMMAND, 0xF0); j = inportb(D12_DATA); j = inportb(D12_DATA); for(i=0; i<j; i++) *(buf+i+k) = inportb(D12_DATA); //??? k += j; outportb(D12_COMMAND, 0xF2); bDblBuf --; //??? } if(bEPPflags.bits.in_isr == 0) ENABLE; return k; } void ep1_txdone(void) { D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */ //3是怎么得出的? } |
|
6楼#
发布于:2002-12-09 17:47
请问斑竹:
什么时候需要用到init_config 和init_unconfig?void get_interface(void) { unsigned char txdat = 0; /* Only/Current interface = 0 */ //为什么txdat = 0,就有Only/Current interface = 0 single_transmit(&txdat, 1); //??? } void outportb(unsigned char port, unsigned char val) { MCU_D12CS=0; if(port) XBYTE[0xff00]=val; else XBYTE[0xfe00]=val; //0xff00,0xfe00是怎么确定的? MCU_D12CS=1; } void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable) { if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND, 0xD0); if(bEnable) bAddress |= 0x80; outportb(D12_DATA, bAddress); if(bEPPflags.bits.in_isr == 0) ENABLE; //在程序中经常会看到if( ) disable;if() enable;有什么作用? } |
|