Hi Yang,

On 26 August 2013 03:47, Yang Ning <[email protected]> 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