[U-Boot-Users] Few U-boot architecture/implementation questions
Wolfgang Denk
wd at denx.de
Wed Sep 8 18:25:11 CEST 2004
Dear Robin,
in message <6.1.1.1.0.20040907142107.01de03e0 at wheresmymailserver.com> you wrote:
>
> For serial I/O, the cpu specific function found in /cpu/<processor>serial.c
> named serial_getc(void); can either be implemented where
> - serial_getc sits a bangs on UART_rx_buff as fast as it can, until
> something shows up. (idle loop of wait for keystroke).
> OR
> - an independent uart_rx_int populates a ring buffer, serial_getc grabs
> the character from the ring buffer, if there isn't a char in the ring
> buffer, go to sleep for 1ms (at 115,200 Buad, 8N1; 1 char = ~87us; as long
> as the ring buffer can cope with 12 chars you should be OK).
>
> It seems as if most of the implementations that I looked at do the first -
> which is easier, but it is also why monitors, boot loaders, etc are
> usually worse case power consumers. (IMHO - idle loops should be idle - not
Boot loaders are boot loaders, i. e. tools to load and start some-
thing. In the target system, you want to spend as few milliseconds in
the boot loader as possible. Don't worry about power consumption
during this time.
The design principle for U-Boot is to make it as easily to port to
new hardware as possible, which means: use a polling driver.
> wait for keystroke - but it is harder, and adds complexity - you still can
> get UART interrupts when you have networking activity, and you need to make
> sure that you can handle both - so I can understand why it is implemented
> as is).
U-Boot is strictly single tasking. Such added complexity is not
wanted, and not needed.
> Question #2
> ---------------------------
> For Networking functions - I have a SMSC LAN911C11 on the first target
> board, and every time I access the networking functions, it seems to
> re-initalize the SMSC 9191C111.
Please define what "access the networking functions" means.
> Is this normal? Or do I have a bug (I would assume - bug, but didn't see
> anything yet).
Normally the ethernet interface gets initialized only once - when you
use the first U-Boot command that acceses the ethernet. An exception
is systems with multiple interfaces - here a switch to a different
interface will cause this interface to be (re-) initialized.
But if you mean that you run 5 times the "tftp" command then you
should see only a single init call (before the first transfer
starts).
> Question #3
> ----------------------
> In /include/configs/<board>.h what should CFG_HZ be set to? Lost of
> different boards seem to be set to 1000 , (but I don't think that they are
CFG_HZ is the number of clock tick (timer interrupts) per second.
Typically the timer is configured to run at 1 kHz, thus the 1000.
Some ports misunderstood the meaning of CFG_HZ and use atronomical
values which break this meaning. Some of them even cause warnings
because of integer overflows when computing delays etc. Such ports
are broken and should be fixed.
> all running at the same frequency) but then some are not - I could not find
> it int the docs (but maybe didn't look hard enough)
A patch to update the READEM is welcome ;-)
> Question #4
> --------------------
> In /cpu/<cpu_type>interrupts.c in the function udelay(unsigned long usec) -
> how exact should this be? (exactly 1.00000us or +/- 5% is OK?)
Ther eis no realtime critical stuff in U-Boot. Make it as pricise as
possible without breaking a leg.
> Question #5
> ----------------------
> In /lib_<cup_type>/timer.c (for those processors that have it) - I have a
> processor that supports ticks in terms of instructions clocks (up to
> 750MHz) or peripheral clock ticks (up to 133MHz). I assume that peripheral
> clocks ticks are OK. (and that loosing the accuracy is not a big deal).
U-Boot does not assume nor guarantee any accuracy of timers.
> Question #6
> -------------------
> Which is actually more of a feature enhancement that a question - if I
> implement a autobaud routine in /cpu/<cpu_type>/serial.c in the function
> serial_tstc - that would be the correct place for it? (If no key presses,
> return 0, if there is a key press - figure out the speed, set the UART up
> properly if it is not, and then return a 1 ?)
Autobaud is easy to implement, but difficult to combine with other
existing features like the autoboot configuration options (password,
etc.) - see doc/README.autoboot; when the port is autobauding it will
be difficult not to break existing code.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-4596-87 Fax: (+49)-8142-4596-88 Email: wd at denx.de
The number you have dialed is imaginary. Please divide by 0 and try
again.
More information about the U-Boot
mailing list