5285|10

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LPC11U14做的USB键盘在mac电脑下无法关机 [复制链接]

如题:
   我使用LPC11U14做一个USB键盘,在windows系统下都能正常,一旦我把键盘插到MAC电脑上面,就会导致MAC电脑一直无法关机,会一直停在小菊花那边,但是,如果我这时拔掉键盘,就能马上关机了,我使用其他的键盘插在MAC电脑上,是能正常关机的,这样,就确定是我键盘firmware程序有问题了,但是,我把所有的代码全部屏蔽掉,只剩下USB初始化,让主机能识别到USB键盘,这个时候仍然是不能关机,现象是,我关机的时候,键盘还没有断电,我猜测是不是没有断电导致键盘还一直在运行,所有导致MAC无法关机呢?另外,我怀疑是不是我USB的代码有问题,所以详细看了下代码,代码是我在网上找的,其中,关于USB端点初始化有部分不理解,代码如下:

#define USB_EPLIST_ADDR 0x20004000
#define USB_EPDATA_ADDR (USB_EPLIST_ADDR + 0x100)
#define USB_EPDATA_PAGE (USB_EPDATA_ADDR&0xFFC00000)/* Bit 22~31 is the page */


/*
*  USB EP List Initialize Function
*    Called by the USB_Init to initialize USB EPList memory
*    The example below is the simpliest case, every location is pre-configured
*    with fixed length for each EP. See USB chapter, Endpoint Command/Status
*    List for more details.
*
*    Parameters:      None
*    Return Value:    None
*/
void NDrv_USB_EPInit(void)
{
U32 *addr, data_ptr,i, j = 0;
addr = (U32 *)USB_EPLIST_ADDR;
LPC_USB->EPLISTSTART = USB_EPLIST_ADDR;
data_ptr = USB_EPDATA_ADDR;
LPC_USB->DATABUFSTART = USB_EPDATA_PAGE;
/* CTRL, BULK or Interrupt IN/OUT EPs, max EP size is 64 */
/* For EP0, double buffer doesn't apply to CTRL EPs, but, EP0OUTBuf0 is
for EP0OUT, EP0OUTBuf1 is for SETUP, EP0INBuf0 is for EP0IN, EP0INTBuf1 is
reserved. Also note: ACTIVE bit doesn't apply to SETUP and Reserved EP buffer. */
*addr++ = (USB_MAX_PACKET0 << 16)|((U16)(data_ptr >> 6));
g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_PACKET0;
data_ptr += USB_MAX_PACKET0;
*addr++ = ((U16)(data_ptr >> 6));/* No length field for SETUP */
g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
g_USBHW_Setting.EPList[j++].buf_length = USB_SETUP_PACKET_SIZE;
/* For easier alignment, the data field is aligned to 64 bytes for all EPs. */
data_ptr += USB_MAX_PACKET0;
*addr++ = (USB_MAX_PACKET0 << 16)|((U16)(data_ptr >> 6));
g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_PACKET0;
data_ptr += USB_MAX_PACKET0;
#if 0
/* EP0 IN second buffer(buffer1) is reserved. */
*addr++ = (USB_MAX_PACKET0<<16)|((uint16_t)(data_ptr>>6));
#else
addr++;
#endif
g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_PACKET0;
data_ptr += USB_MAX_PACKET0;
for(i = 2; i < USB_EP_NUM; i++)
{
  /* Buffer 0 */
#if USB_ISO_COMMUNICATION
  *addr++ = EP_DISABLED|EP_ISO_TYPE|(USB_MAX_ISO_SIZE << 16)|((U16)(data_ptr >> 6));
  g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
  g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_ISO_SIZE;
  data_ptr += USB_MAX_ISO_SIZE;
#else
  *addr++ = EP_DISABLED|(USB_MAX_NON_ISO_SIZE << 16)|((U16)(data_ptr >> 6));
  g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
  g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_NON_ISO_SIZE;
  data_ptr += USB_MAX_NON_ISO_SIZE;
#endif
  /* Buffer 1 */
#if USB_ISO_COMMUNICATION
  *addr++ = EP_DISABLED|EP_ISO_TYPE|(USB_MAX_ISO_SIZE << 16)|((U16)(data_ptr >> 6));
  g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
  g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_ISO_SIZE;
  data_ptr += USB_MAX_ISO_SIZE;
#else
  *addr++ = EP_DISABLED|(USB_MAX_NON_ISO_SIZE << 16)|((U16)(data_ptr >> 6));
  g_USBHW_Setting.EPList[j].buf_ptr = data_ptr;
  g_USBHW_Setting.EPList[j++].buf_length = USB_MAX_NON_ISO_SIZE;
  data_ptr += USB_MAX_NON_ISO_SIZE;
#endif
}
}
这里面的addr主要是用来做什么的呢?它一直在++,但是没有用到这个地址啊,另外, *addr++ = EP_DISABLED|EP_ISO_TYPE|(USB_MAX_ISO_SIZE << 16)|((U16)(data_ptr >> 6));
是什么意思?为什么要右移6位?为什么包大小要左移16位?
我知道LPC11U14的USBRAM是在地址0X20004000处,在程序中 LPC_USB->DATABUFSTART = USB_EPDATA_PAGE又是什么意思?为什么 USB_EPDATA_PAGE要在0X20004000地址基础上加0X100?
求大神指导,急啊!!!!!
此帖出自NXP MCU论坛

最新回复

我也好久没有弄USB了,记不得了,你自己查查吧  详情 回复 发表于 2013-2-20 08:59
点赞 关注
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
看看你的硬件电路是否提供USB软开关功能。。。。
此帖出自NXP MCU论坛

点评

您好,您所说的软开关是什么意思呢? 是说PIO0_6的CONNECT需要上拉1.5K电阻连接开关到USB_DP吗?这个我的硬件上面有,但是,这个和在MAC上面不能关机有直接关系吗?  详情 回复 发表于 2013-2-19 10:37
 
个人签名我的博客
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 zhaojun_xf 的帖子

您好,您所说的软开关是什么意思呢? 是说PIO0_6的CONNECT需要上拉1.5K电阻连接开关到USB_DP吗?这个我的硬件上面有,但是,这个和在MAC上面不能关机有直接关系吗?
此帖出自NXP MCU论坛

点评

既然MAC要关机,就会把USB输出电流关断,如果不能通过软件关断电流,MAC认为有设备在工作,所以就不能关机。你要检查的是能否通过软件关掉USB.  详情 回复 发表于 2013-2-19 10:42
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

4
 

回复 板凳 cc474231890 的帖子

既然MAC要关机,就会把USB输出电流关断,如果不能通过软件关断电流,MAC认为有设备在工作,所以就不能关机。你要检查的是能否通过软件关掉USB.
此帖出自NXP MCU论坛

点评

另外,按道理说系统关机的时候应该会告诉USB设备它要关机了,那么,系统会发一个什么样的包给我的USB设备呢?我使用USB协议分析仪去抓这个包,但是没有抓到系统给我设备发的特殊的包,只抓到了一个关掉键盘上面3个指  详情 回复 发表于 2013-2-19 11:11
谢谢您的建议,但是,您所说的通过软件关掉USB是怎样做到的呢?比如说,要怎样的硬件条件才能关掉USB?  详情 回复 发表于 2013-2-19 11:07
 
个人签名我的博客
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 zhaojun_xf 的帖子

谢谢您的建议,但是,您所说的通过软件关掉USB是怎样做到的呢?比如说,要怎样的硬件条件才能关掉USB?
此帖出自NXP MCU论坛

点评

就是你上面说到的管脚。你可以通过镊子短接看看,关掉USB后能否关机,如果还不行就要 考虑用其他方式关掉设备电源了。  详情 回复 发表于 2013-2-19 11:12
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 zhaojun_xf 的帖子

另外,按道理说系统关机的时候应该会告诉USB设备它要关机了,那么,系统会发一个什么样的包给我的USB设备呢?我使用USB协议分析仪去抓这个包,但是没有抓到系统给我设备发的特殊的包,只抓到了一个关掉键盘上面3个指示灯的包。
此帖出自NXP MCU论坛
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

7
 

回复 5楼 cc474231890 的帖子

就是你上面说到的管脚。你可以通过镊子短接看看,关掉USB后能否关机,如果还不行就要 考虑用其他方式关掉设备电源了。
此帖出自NXP MCU论坛

点评

谢谢版主的耐心回答,我刚刚试过了,直接短接,使USB_DP侦测不到1.5K的电阻,来关掉USB同样不能关机,然后,您所说的其他方式来关闭设备电源要怎么实现呢?同样,我怎样才知道现在系统要关机了呢?  详情 回复 发表于 2013-2-19 11:22
 
个人签名我的博客
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 7楼 zhaojun_xf 的帖子

谢谢版主的耐心回答,我刚刚试过了,直接短接,使USB_DP侦测不到1.5K的电阻,来关掉USB同样不能关机,然后,您所说的其他方式来关闭设备电源要怎么实现呢?同样,我怎样才知道现在系统要关机了呢?
此帖出自NXP MCU论坛

点评

加个mos管,软件关USB的同时断掉USB段的电源。  详情 回复 发表于 2013-2-19 11:38
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

9
 

回复 8楼 cc474231890 的帖子

加个mos管,软件关USB的同时断掉USB段的电源。
此帖出自NXP MCU论坛

点评

怎样才知道是要关机呢?也就是说,什么情况下我才让USB断电呢?我需要从主机收到什么包?  详情 回复 发表于 2013-2-19 13:56
 
个人签名我的博客
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 9楼 zhaojun_xf 的帖子

怎样才知道是要关机呢?也就是说,什么情况下我才让USB断电呢?我需要从主机收到什么包?
此帖出自NXP MCU论坛

点评

我也好久没有弄USB了,记不得了,你自己查查吧  详情 回复 发表于 2013-2-20 08:59
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

11
 

回复 10楼 cc474231890 的帖子

我也好久没有弄USB了,记不得了,你自己查查吧
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表