qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/1] add output register property and update the


From: Zhou Yuan
Subject: Re: [Qemu-devel] [PATCH 1/1] add output register property and update the
Date: Tue, 15 Oct 2013 15:35:11 +0800

From: Zhouy <address@hidden>
To: address@hidden
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: address@hidden 
--------------------------------------------------
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:address@hidden
--------------------------------------------------
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.
 
address@hidden
15:14:50

reply via email to

[Prev in Thread] Current Thread [Next in Thread]