【請問 ch374 設置NUMlock指示燈問題】

有一個問題,為什么設置Set_Report()鍵盤數(shù)字燈只是亮一下 就熄滅了 請問什么原因, buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //設置報表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //設置報告出錯 //if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 } UploadImages/201272810295895.rar

設置命令成功了嗎?按照SET-REPORT命令應該是可以點燈的。除非這條命令沒有發(fā)送成功。


應該成功啦 , 指示燈只亮一下 ,之后就不亮了~!不知道是我程序哪里的原因


Set_Report命令緊接著得發(fā)個OUT命令,此時OUT對應的endp in addr=0,而不是endp in addr=1,點燈是對端點0操作的


UINT8 HostCtrlTransfer374( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 如果需要接收和發(fā)送數(shù)據(jù),那么DatBuf需指向有效緩沖區(qū)用于存放后續(xù)數(shù)據(jù),實際成功收發(fā)的總長度保存在ReqLen指向的字節(jié)變量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP階段,200mS超時 if ( s == USB_INT_SUCCESS ) // SETUP成功 { tog = TRUE; // 默認DATA1,默認無數(shù)據(jù)故狀態(tài)階段為IN if((*(ReqBuf+3))==0x22) { total=*( ReqBuf + 6 )-0x40; } else total = *( ReqBuf + 6 ); if ( total && DatBuf ) // 需要收數(shù)據(jù) { len = total; if ( *ReqBuf & 0x80 ) // 收 { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_IN, tog, 200 ); // IN數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包 tog = tog ? FALSE : TRUE; } tog = FALSE; // 狀態(tài)階段為OUT } else { // 發(fā) while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_LENGTH, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // OUT數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? FALSE : TRUE; } tog = TRUE; // 狀態(tài)階段為IN } total -= len; // 減去剩余長度得實際傳輸長度 } if ( s == USB_INT_SUCCESS ) // 數(shù)據(jù)階段成功 { Write374Byte( REG_USB_LENGTH, 0 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), TRUE, 200 ); // STATUS階段 if ( tog && s == USB_INT_SUCCESS ) // 檢查IN狀態(tài)返回數(shù)據(jù)長度 { if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; // 狀態(tài)階段錯誤 } } } if ( RetLen ) *RetLen = total; // 實際成功收發(fā)的總長度 return( s ); }

UINT8 Set_Report(unsigned char *p) { UINT8 s,l=1; s=HostCtrlTransfer374(SetupSetReport,p,&l); //實際的數(shù)據(jù)可以寫別的數(shù)據(jù),這個你可以用計算機抓下數(shù)據(jù)在發(fā)下去 return s; }

Set_Report fun里面調(diào)用了HostCtrlTransfer374 里面已經(jīng)包含了對 相應的操作, 請問如何 發(fā)送OUT 命令,


HostCtrlTransfer374 里面已經(jīng)包含了對 相應的操作, s = HostTransact374( i & 0x7F, DEF_USB_PID_IN, i & 0x80 ); // CH374傳輸事務,獲取數(shù)據(jù) if ( s == USB_INT_SUCCESS ) { i ^= 0x80; // 同步標志翻轉 // 保存同步標志位 RootHubDev[n].Endp_Attr[0] = i; i = Read374Byte( REG_USB_LENGTH ); // 接收到的數(shù)據(jù)長度 if ( i ) { Read374Block( RAM_HOST_RECV, i, TempBuf ); // 取出數(shù)據(jù)并打印 if(TempBuf[2]==0x53){ //是MumLock ,用于開啟鍵盤燈 if(Led_Flag&0x01){ buffer[0] = Led_Flag&0XFE; } else{ buffer[0] = Led_Flag|0X01; } Led_Flag =Led_Flag^0x01; s = Set_Report(RootHubDev[n].bInterfaceList[0], buffer ); //點燈 printf("s=%d\n",(UINT16)s); } else if(TempBuf[2]==0x39){ if(Led_Flag&0x02){ buffer[0] = Led_Flag&0XFD; } else{ buffer[0] = Led_Flag|0X02; } Led_Flag =Led_Flag^0x02; s = Set_Report(RootHubDev[n].bInterfaceList[0], buffer ); } else if(TempBuf[2]==0x47){ if(Led_Flag&0x04){ buffer[0] = Led_Flag&0XFB; } else{ buffer[0] = Led_Flag|0X04; } Led_Flag =Led_Flag^0x04; s = Set_Report( RootHubDev[n].bInterfaceList[0],buffer ); }


我 按照你的代碼修改的,可是 NUMlock 燈 還是亮一下就熄滅了了 我新建立一個HostCtrlTransfer374 函數(shù) UINT8 HostCtrlTransfer374_1( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 如果需要接收和發(fā)送數(shù)據(jù),那么DatBuf需指向有效緩沖區(qū)用于存放后續(xù)數(shù)據(jù),實際成功收發(fā)的總長度保存在ReqLen指向的字節(jié)變量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP階段,200mS超時 if ( s == USB_INT_SUCCESS ) // SETUP成功 { tog = TRUE; // 默認DATA1,默認無數(shù)據(jù)故狀態(tài)階段為IN if((*(ReqBuf+3))==0x22) { total=*( ReqBuf + 6 )-0x40; } else total = *( ReqBuf + 6 ); if ( total && DatBuf ) // 需要收數(shù)據(jù) { len = total; if ( *ReqBuf & 0x80 ) // 收 { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // IN數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包 tog = tog ? FALSE : TRUE; } tog = FALSE; // 狀態(tài)階段為OUT } else { // 發(fā) while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_H_PID, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // OUT數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? FALSE : TRUE; } tog = TRUE; // 狀態(tài)階段為IN } total -= len; // 減去剩余長度得實際傳輸長度 } // if ( s == USB_INT_SUCCESS ) // 數(shù)據(jù)階段成功 // { // Write374Byte( REG_USB_LENGTH, 0 ); // mDelayuS( 100 ); // s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), TRUE, 200 ); // STATUS階段 // if ( tog && s == USB_INT_SUCCESS ) // 檢查IN狀態(tài)返回數(shù)據(jù)長度 // { // if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; // 狀態(tài)階段錯誤 // } // } }

我每條語句都仔細看了 看不出什么不對


s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // 執(zhí)行這條語句的時候 燈閃一下 之后反應了


用這個函數(shù) HostCtrlTransfer374執(zhí)行,DatBuf中裝數(shù)據(jù)---燈的狀態(tài)(一個字節(jié))


我是用這個函數(shù)啊 問題解決不了


DatBuf里面的數(shù)據(jù)是多少


0x01, 我從0x00 到 0xff 都試過了


我已經(jīng)把我的代碼 上傳上去了,這個問題困擾我很久了,麻煩 WanJ 你幫忙 查看一下


你在發(fā)送完SET-REPORT控制請求后加一個死循環(huán)在那邊,你看下等還會不會滅掉。實在不行可以講你的鍵盤發(fā)至我司幫你調(diào)試軟件。


加死循環(huán) 還是如此 我的實驗板就一塊。


我想問 SetupSetReport[]={0x21,0x09,0x00,0x02,0x00,0x00,0x01,0x00}; 這個數(shù)組里的數(shù)據(jù)是怎么得到的 還有 NumLock 跟這些數(shù)據(jù)有關系么


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频