由于寄存器中的4个保留位而屏蔽4个lsb位 - OHCI USB主机实现 - 不可恢复的错误

时间:2015-07-26 21:19:11

标签: embedded usb host firmware

我正在使用AT91SAM9G45并正在实施OHCI以实现全速USB主机。

我创建了端点描述符(ED)和传输描述符(TD),它们被创建为结构指针。

主机控制器驱动程序(HCD)应该在HcControlHeadED寄存器中写入头部ED的地址。这是一个32位寄存器,保留最后4位,全部为0。当我创建一个ED结构指针时,当我在HcControlED寄存器中写入这个32位地址时,我得到一个32位地址,最后4位被屏蔽,它们变为零。

我该如何解决这个问题?

当给主机控制器开始处理控制ED的命令时,我得到一个不可恢复的错误(可以说这是因为设置了不可恢复的错误位),我猜这是因为最后4位get masked更改指针地址。

如何解决此问题?

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);

1 个答案:

答案 0 :(得分:2)

如果将来有人面临这个问题,我想出来了,这与我正在使用的环境有关。对齐是一个需要

的gcc
#pragma data_alignment=16 static OHCIEndpointDescriptor *ed1;