[OpenWrt-Devel] ath79: Force usb host mode for ar9331

Piotr Dymacz pepe2k at gmail.com
Sat Nov 16 10:44:27 EST 2019

Hi Micke,

On 08.11.2019 13:30, Micke Prag wrote:
> Den 11/8/19 kl. 11:01 AM, skrev Piotr Dymacz:
>> Hi Micke,
>> On 08.11.2019 08:36, Micke Prag wrote:
>>> In commit 00ea16557d [1] the way usb is initiated was changed. Instead
>>> of initiate both ehci-platform and ci_hdrc the bootstrap status register
>>> is checked and used to determine which platform to initiate.
>> There were other changes later, see for example 57c641ba6e.
> Yes, I was looking at the code after this commit when making my
> conclusions above. But 00ea16557d is the commit that breaks the board
> initially.
>>> Unfortunately this break my board since the gpio used to determine this
>>> is used for other purposes.
>> This means your board has a wrong bootstrap configuration and you
>> should make sure GPIO for host/device mode has correct initialization
>> value.
> Yes, it is correct the bootstrap is not correct at hardware level. But
> there is 30 k+ boards out in the world so fixing this now is a bit
> late... ;)
>>> dev-usb.h only exposes one function:
>>> void ath79_register_usb(void);
>>> so there is not much to alter the way usb is initiated.
>>> I tried to write to the bootstrap register but unfortunately this did
>>> not seem to work:
>>> u32 t;
>>> t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
>>> pr_warn("ath79: Register before %X", t);
>>> ath79_reset_wr(AR933X_RESET_REG_BOOTSTRAP, t);
>>> pr_warn("ath79: Register after %X",
>>> ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP));
>>> Gives the following output:
>>> ath79: Register before 42202
>>> ath79: Register after 42202
>> USB mode in AR9331 is selected at power on, based on GPIO13 value and
>> I'm not aware of any other/software ways to change it. AFAIK, only
>> QCA9563 allows to switch between host and device modes 'on the fly'.
> Is was working before 00ea16557d so simply initialize ehci-platform
> instead ci_hdrc will fix it. Unfortunately I cannot find a way to tell
> ath79_register_usb to force it into host mode in my board file instead
> of reading the bootstrap register.

Do you want to tell me that a board with wrong bootstrap configuration 
and USB switched to device mode was able to use the bus in host mode?

IIRC, during my tests I found that this bootstrap option makes the D+ 
line to gets pulled-up to VBUS and there was no way to change it back.
I would need to make some more tests to confirm that, though.


> Writing to the bootstrap register was a workaround I tried. In the
> datasheet this register should be read/write. I don't know if my code
> for writing the register is wrong or it is simply not possible to write
> into this register.
>>> How can I solve this?
>> Only in hardware I suppose (setup correct initial value on GPIO13).
> It could also be solved by telling the module to force it into host mode
> and not reading the bootstrap register. I am not sure the best approach
> for this that would be accepted upstream.
> Adding a parameter to ath79_register_usb() could be one option?

openwrt-devel mailing list
openwrt-devel at lists.openwrt.org

More information about the openwrt-devel mailing list