[okl4-developer] serial driver l4_kdb

Josh Matthews jmatthews at ok-labs.com
Mon May 26 13:09:43 EST 2008


Hi Lukas,

On Sat, May 24, 2008 at 1:32 AM, Lukas HANEL <lukas.hanel at st.com> wrote:

> Geoffrey Lee wrote:
> > Output via kdb can go out in one of the following two ways:
> >
> > (1) your printf() or whatever libc print function gets routed to
> > libs/c/sys-*/ which ends up calling the kdb character print
> > functions, or you implement your own such as print function
> > and end up calling the kdb character print functions directly
> >
>
> In this case, how/where is the kernel/userland boundary crossed?


This depends on the implementation that the write_fn() and read_fn()
function pointers point to for the stdio fd's. This setup is done in
libs/c/src/sys-{X}/sys_stdio.c (where {X} is the build environment for your
application). For Iguana, the read/write function pointers for stdout are
statically initialised to point to a read_init and write_init function,
which then points them on the first read/write to a read/write function
which uses L4_KDB_PrintChar and L4_KDB_ReadChar. The L4_KDB functions
(architecture-specific, defined in arch/{arch}/libs/l4/include/kdebug.h)
trap into the kernel to perform the read/write - it is here that the
user/kernel boundary is crossed.


> > (2) you use vserial for your i/o.  In this instance you don't
> > really care what the backend is.  If you choose to use l4kdb_uart,
> > it will do a cheesy emulation of a serial device, enough to
> > read and write, anyway.
> >
>
> Using vserial for my i/o means I do not use printf?
> In fact I am now testing the functionality of my serial driver and have
> not yet found a way to send data via the vserial interface. How would I
> do this?


No, you still use printf(). printf() eventually gets routed through to
fputc() (passing stdout as the output stream), which calls the write_fn
function pointer on stdout - as mentioned, that function pointer gets set up
in libs/c/src/sys-{X}/sys_stdio.c, and you can point it to whatever you
want. In this case, you would point it to a write function that would use
the vserial interface to output the character. In fact, this has already
been done -  check out libs/c/src/sys-posix/sys_stdio.c. There are two
functions  - serial_read and serial_write - which would be good to look at
as a starting point to understanding how this is done. When you build an
example in the POSIX environment (using example_env=posix), all output is
over vserial (unless vserial is not available, in which case it falls back
to KDB). Let us know if you have any questions about that.


> Also, I am facing a problem with the kernel console. Iguana and the
> Kernel use the same serial device, like in gumstix. When I send a char,
> I get an interrupt delivered to my driver, but the data register of the
> device is already empty. If, in the kernel's console.cc/get_c() function
> I disable the reading of this register, it works. I programmed the
> kernel timer for a 10ms tick.
> Do you have an idea what I could do? E.g. is it possible to have kernel
> and iguana use the same serial device?


The problem you are seeing is a result of both the kernel and iguana using
KDB for IO - I'd definitely recommend switching over to using a "real"
serial device for applications.

Best regards,
Josh Matthews
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.okl4.org/pipermail/developer/attachments/20080526/088d3cc1/attachment.htm 


More information about the Developer mailing list