From: "Zhou Yuan" <zhouyuan.fnst@cn.fujitsu.com>
To: qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH 1/1] add output register property and update the
Date: Tue, 15 Oct 2013 15:35:11 +0800 [thread overview]
Message-ID: <201310151535092762175@cn.fujitsu.com> (raw)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="us-ascii", Size: 4830 bytes --]
From: Zhouy <zhouyuan.fnst@cn.fujitsu.com>
To: qemu-devel@nongnu.org
Date: Tue, 15 Oct 2013 15:20:47 -0400
Subject: Re: [PATCH 1/1] add output register property and update the
outputports level when necessary
I found some instruction of output port register in the datasheet:
" Reads from the output port register reflect the value that is in the flip-flop
controlling the output selection, not the actual I/O value, which may differ if
the out-put is overloaded."
So the level of output pins should be updated according to the "Output Register"
when Configuration Register" is writen.
> qemu-master/hw/gpio/max7310.c | 33 ++++++++++++++++++++++-----------
> 1 files changed, 22 insertions(+), 11 deletions(-)
>
>diff --git a/qemu-master/hw/gpio/max7310.c b/qemu-master/hw/gpio/max7310.c
>index 59b2877..ffbeb6f 100644
>--- a/qemu-master/hw/gpio/max7310.c
>+++ b/qemu-master/hw/gpio/max7310.c
>@@ -19,10 +19,25 @@ typedef struct {
> uint8_t polarity;
> uint8_t status;
> uint8_t command;
>+ uint8_t output;
> qemu_irq handler[8];
> qemu_irq *gpio_in;
> } MAX7310State;
>
>+/*this function to update outputports level*/
>+static void max7310_update(MAX7310State *s)
>+{
>+ uint8_t diff = 0;
>+ uint8_t line = 0;
>+ for (diff = (s->output ^ s->level) & ~s->direction; diff;
>+ diff &= ~(1 << line)) {
>+ line = ffs(diff) - 1;
>+ if (s->handler[line]) {
>+ qemu_set_irq(s->handler[line], (s->output >> line) & 1);
>+ }
>+ }
>+ s->level = (s->level & s->direction) | (s->level & ~s->direction);
>+}
>+
> static void max7310_reset(DeviceState *dev)
> {
> MAX7310State *s = FROM_I2C_SLAVE(MAX7310State, I2C_SLAVE(dev));
>@@ -31,6 +46,8 @@ static void max7310_reset(DeviceState *dev)
> s->polarity = 0xf0;
> s->status = 0x01;
> s->command = 0x00;
>+ s->output = 0x00;
>+ max7310_update(s);
> }
>
> static int max7310_rx(I2CSlave *i2c)
>@@ -43,7 +60,7 @@ static int max7310_rx(I2CSlave *i2c)
> break;
>
> case 0x01: /* Output port */
>- return s->level & ~s->direction;
>+ return s->output;
> break;
>
> case 0x02: /* Polarity inversion */
>@@ -71,8 +88,6 @@ static int max7310_rx(I2CSlave *i2c)
> static int max7310_tx(I2CSlave *i2c, uint8_t data)
> {
> MAX7310State *s = (MAX7310State *) i2c;
>- uint8_t diff;
>- int line;
>
> if (s->len ++ > 1) {
> #ifdef VERBOSE
>@@ -89,13 +104,8 @@ static int max7310_tx(I2CSlave *i2c, uint8_t data)
>
> switch (s->command) {
> case 0x01: /* Output port */
>- for (diff = (data ^ s->level) & ~s->direction; diff;
>- diff &= ~(1 << line)) {
>- line = ffs(diff) - 1;
>- if (s->handler[line])
>- qemu_set_irq(s->handler[line], (data >> line) & 1);
>- }
>- s->level = (s->level & s->direction) | (data & ~s->direction);
>+ s->output = data;
>+ max7310_update(s);
> break;
>
> case 0x02: /* Polarity inversion */
>@@ -103,8 +113,8 @@ static int max7310_tx(I2CSlave *i2c, uint8_t data)
> break;
>
> case 0x03: /* Configuration */
>- s->level &= ~(s->direction ^ data);
> s->direction = data;
>+ max7310_update(s);
> break;
>
> case 0x04: /* Timeout */
>@@ -156,6 +166,7 @@ static const VMStateDescription vmstate_max7310 = {
> VMSTATE_UINT8(polarity, MAX7310State),
> VMSTATE_UINT8(status, MAX7310State),
> VMSTATE_UINT8(command, MAX7310State),
>+ VMSTATE_UINT8(output, MAX7310State),
> VMSTATE_I2C_SLAVE(i2c, MAX7310State),
> VMSTATE_END_OF_LIST()
> }
>--
>1.7.6
Ping,anyone?
--------------
A new email address of FJWAN is launched from Apr.1 2007.
The updated address is: zhouyuan.fnst@cn.fujitsu.com
--------------------------------------------------
Zhou Yuan
Nanjing Fujitsu Nanda Software Tech. Co., Ltd.(FNST)
No. 6 Wenzhu Road, Nanjing, 210012, China
TEL:+86+25-86630566-9555
FUJITSU INTERNAL:7998-9555
FAX:+86+25-83317685
EMail:zhouyuan.fnst@cn.fujitsu.com
--------------------------------------------------
This communication is for use by the intended recipient(s) only and may contain information that is privileged, confidential and exempt from disclosure under applicable law. If you are not an intended recipient of this communication, you are hereby notified that any dissemination, distribution or copying hereof is strictly prohibited. If you have received this communication in error, please notify me by reply e-mail, permanently delete this communication from your system, and destroy any hard copies you may have printed.
zhouyuan.fnst@cn.fujitsu.com
15:14:50
reply other threads:[~2013-10-15 7:35 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=201310151535092762175@cn.fujitsu.com \
--to=zhouyuan.fnst@cn.fujitsu.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).