qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] Fw: Max7310: confused about the method of reading outpu


From: andrzej zaborowski
Subject: Re: [Qemu-devel] Fw: Max7310: confused about the method of reading output port register
Date: Mon, 2 Sep 2013 00:38:48 +0200

Hi Yang,

On 26 August 2013 03:47, Yang Ning <address@hidden> wrote:
>
> Dear  All:
>
> Firstly,I'm writing to express my thanks to Zaborowski for the source code
> of Max7310 which have helped me so much.
>  But I'm still confused about the method of reading output port register.
> code:
>>
>>    case 0x01:   /* Output port */
>>        return s->level & ~s->direction;
>>        break;
>
>
> 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,in my opinion,in the defination of MAX7310State,whether the property of
> outputport_reg should be added?
> And does the method of reading/writing output port should be modified as
> follows.
>
> [reading]
>     case 0x01:  /* Output port */
>         return s->outputport_reg;
>         break;
> [writing]
>     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->outputport_reg =  data;
>         break;

Yes, if by "overload" they mean change direction to "input", then yes,
I think you are correct.

Personally I'd call it s->output.  I'm wondering if we may need to
update the output levels when the Configuration (0x03) is written and
on reset.  This would be best done by adding a short function
max7310_update() that does the "for (diff = ...)" loop and calls
qemu_set_irq.

Best regards



reply via email to

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