我正在使用AT91SAM9G45,并正在实现OHCI全速USB主机实现。
我已经创建了端点描述符(ED)和传输描述符(TD),它们被创建为结构指针。
主机控制器驱动程序(HCD)应该在hccontrolhead寄存器中写入头ED的地址。这是一个32位寄存器,最后4位保留,都是0。当我创建一个ED结构指针时,我得到一个32位地址,当我在HcControlED寄存器中写入这个32位地址时,最后4位被屏蔽,它们变成零。
如何解决这个问题?
当主机控制器被命令开始处理控制ED时,我得到一个不可恢复的错误(可以说这是因为不可恢复的错误位被设置了),我猜这是因为最后4位被屏蔽了,这改变了指针地址。
如何解决这个问题?
typedef struct {
/ FunctionAddress | EndpointNumber | Direction | Speed | sKip | Format
// MaximumPacketSize
volatile unsigned int Control;
// TailP: TDQueueTailPointer
volatile unsigned int TailP;
// HeadP: TDQueueHeadPointer Points to the next TD to be processed for
volatile unsigned int HeadP;
// NextED: If nonzero, then this entry points to the next ED on the list
volatile unsigned int NextEd;
} __attribute__((aligned(16))) OHCIEndpointDescriptor;
OHCIEndpointDescriptor *ed1;
AT91C_BASE_UHP->UHP_HcControlHeadED=((unsigned int)&ed1);
如果将来有人遇到这个问题,我想出来了,这与我使用的环境有关。对齐是gcc的一个功能,需要
#pragma data_alignment=16 static OHCIEndpointDescriptor *ed1;