qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Cc: Hinko Kocevar <hinkocevar@gmail.com>,
	QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: simple serial device emulation
Date: Sat, 11 Sep 2021 16:23:25 +0100	[thread overview]
Message-ID: <CAFEAcA8DHC+_2BqqdH88oVDoNuPGuWysMC3DjDt4oj2_wfAKLg@mail.gmail.com> (raw)
In-Reply-To: <fe2a2b9d-e7b6-cbf6-ea3a-49702e297562@amsat.org>

On Fri, 10 Sept 2021 at 22:51, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>
> On 9/10/21 9:35 PM, Hinko Kocevar wrote:
> > I have an emulated MMIO area holding couple of registers that deal with
> > serial UART. Very simple access to the Tx and Rx registers from the
> > userspace point of view involves polling for a bit in one register and
> > then writing another; when there is room for another character. When the
> > guest app does write to a MMIO Tx register, as expected, io_writex() is
> > invoked and my handler is invoked. At the moment it does not do much.
> > I'm thinking now that the character needs to be fed to the serial device
> > instance or something.
> >
> > Where should I look for suitable examples in the qemu code? I reckon
> > that other machines exist that do the similar. I found lots of
> > serial_mm_init() and sysbus_mmio_map() uses around serial port instances
> > but I'm not sure how to couple my "serial ops" to the "bus" or SerialMM
> > (if that is the way to go).
>
> Your device is a "character device frontend". See the API in
> include/chardev/char-fe.h. Frontends can be connected to various
> backends. The simplest backend is the standard input/output
> (named 'stdio').

More specifically, it's a UART model. All of our UART models
are in hw/char/.

> I recommend you to look at the hw/char/digic-uart.c model which is
> quite simple, it returns the last char received, and only transmit
> one char per I/O.

digic-uart does still use the old qemu_chr_fe_write_all() blocking
API, though (there is an XXX comment about that). If you want an
example of the non-blocking approach, try hw/char/cmsdk-apb-uart.c.

> Finally the hw/char/serial.c is probably the most complete models,
> with 2 FIFOs (RX & TX) and try to respect timings.

hw/char/serial.c is kind of complicated though, both because
it's quite old code that's been gradually modernized, and also
because it has to support both mmio and io port type serial ports.
So I'm not sure I'd recommend it as an example to learn from.

-- PMM


  reply	other threads:[~2021-09-11 15:25 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-10 19:35 simple serial device emulation Hinko Kocevar
2021-09-10 21:49 ` Philippe Mathieu-Daudé
2021-09-11 15:23   ` Peter Maydell [this message]
2021-09-11 16:08     ` Hinko Kocevar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAFEAcA8DHC+_2BqqdH88oVDoNuPGuWysMC3DjDt4oj2_wfAKLg@mail.gmail.com \
    --to=peter.maydell@linaro.org \
    --cc=f4bug@amsat.org \
    --cc=hinkocevar@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).