qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] Fwd: Trying to write a new device / virtio-i2c ?


From: Alex David
Subject: Re: [Qemu-devel] Fwd: Trying to write a new device / virtio-i2c ?
Date: Mon, 17 Feb 2014 14:11:40 +0100

 

I'm emulating a bunch of sensors/actuators.

If I virtualize my sensors and attach them to the i2c-dev with -device,
how do I get those data on the host then ?

It depends on your use case.

It could be that you can make them return a constant value.

Otherwise, you may want to use a chardev for that purpose, or finally a QOM (QEMU Object Model) property.  For example, add

CONFIG_TMP105=y

to default-configs/x86_64-softmmu.mak before building QEMU, then do the following (indented = in the guest):

$ x86_64-softmmu/qemu-system-x86_64 --enable-kvm ~/test2.img  -m 256 \
   -device tmp105,id=sensor,address=0x50 \
   -qmp unix:$HOME/qmp.sock,server,nowait
$ qmp/qom-list -s ~/qmp.sock /machine/peripheral/sensor
temperature
@parent_bus/
address
hotpluggable
realized
type
$ scripts/qmp/qmp-shell ~/qmp.sock
(QEMU) qom-get path=/machine/peripheral/sensor property=temperature
{u'return': 0}
(QEMU) qom-get path=sensor property=address
{u'return': 80}

    # modprobe i2c-dev
    # i2cget -y 0 0x50 0 w
    0x0000

(QEMU) qom-set path=sensor property=temperature value=20000
{u'return': {}}

    # i2cget -y 0 0x50 0 w
    0x0014

For this particular sensor, you have to swap the two bytes and the result is 8.8 fixed-point.

Paolo


Thanks for your help. As you may see, I'm not that experienced in
QEMU/Linux kernel.


Ok, I'm gonna try these things. I might try to use a chardev also. Thanks for your help !


I've tried using tmp105. As my linux isn't 64bits, i'm using qemu-system-i386... It crashes my computer when I use it with my linux image (it's a debian .qcow2..., easy to do some tests...).

I will most probably need a chardev anyways, I will need to read/write data when I want to. I'm gonna be annoying and ask another basic question : I wrote this in my i2c_device_test.c (QEMU device) :

static const TypeInfo mydevice_i2c_type_info = {
    .name            = TYPE_MYDEVICE_I2C,
    .parent            = TYPE_I2C_SLAVE,
    .instance_size    = sizeof(MYDEVICEI2CState),
    .instance_init    = MYDEVICE_i2c_init,
    .class_init        = mydevice_i2c_class_init,
};

I will be able to add a chardev using the properties, right ?

static void mydevice_i2c_class_init(ObjectClass *klass, void *data)
{
    printf("Test init2\n");
   
    I2CSlaveClass *sc = I2C_SLAVE_CLASS(klass);
    DeviceClass *dc = DEVICE_CLASS(klass);

    sc->init = mydevice_i2c_init;
    sc->event = mydevice_i2c_event;
    sc->recv = mydevice_i2c_recv;
    sc->send = mydevice_i2c_send;

    dc->vmsd = &mydevice_i2c_vmstate;
    dc->props = mydevice_i2c_properties;
    dc->realize = mydevice_i2c_realize;
}

Does this seems ok for you ? So far, I understood the "props" are needed for when I'm gonna declare the device at QEMU launch.
I am not sure if it's needed (my i2c-0 should be created anyways), but in that case, how do I "plug" it on my socket on the host ?

Thanks !

reply via email to

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