yiming_x
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1337回复:6

请问斑竹关于固件的几个问题,恳请解答!

楼主#
更多 发布于:2002-12-09 17:37
在<<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();
}

最新喜欢:

crazyqpcrazyq...
yiming_x
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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比较熟悉的高手可否大致的讲解一下?我将不胜感激!!!
yiming_x
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
}





chengjian_hui
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2003-09-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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()里。
  

  水平有限,回答至此,还请多多包涵。

yiming_x
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
}
}
这一打断程序的思路我都不清晰,恳请高手指点!!!不胜感激!!!

yiming_x
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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是怎么得出的?
}
yiming_x
驱动牛犊
驱动牛犊
  • 注册日期2002-10-27
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;有什么作用?
}



游客

返回顶部