[Qemu-devel] How to write a backend receiving routine
Hi, all I'm a beginner with QEMU. I'm trying to write a CAN device and also a backend. However while I try to write a backend receiving routine, some thing confuse me. I hope I can get some help here. Actually, I try to figure out how backend udp works at first, also a serial pci acts as a frontend. The functions qemu_set_fd_handler2() and qemu_chr_add_handlers() are used for backend udp and frontend serial pci seperatly to register the necessary routines. In the function main_loop_wait() in main-loop.c will check whether we need to receive some data, if needed, data will be read from backend. Following is the question. I change serial_can_receive1()-hw/serial.c which is registered to test if we need data to return 1 always. So that means we always need data. In main_loop_wait() which actually call main_loop_wait()->os_host_main_loop_wait()->select(), I have checked that before select() called the udp file descriptor has set in rfds. So, if we send some data to the udp backend, the bit in rfds should be set and finally the receive routine we register though qemu_chr_add_handlers() should be called. However, the receiving routine has never been called. I do not know why? And then I try to start QEMU with the following commands, -serial none -chardev udp,id=UDPserial,port=3334 -device pci-serial,chardev=UDPserial and connect it with "nc -u -l -p 3334". Before I insert the linux driver, I try to send some data to qemu, the receiving routine still never be called. After the driver has been inserted, input command "echo test>/dev/ttyS0" then the receiving routine is called. Why? When input "cat /dev/ttyS0" and input some characters in host, the receiving routine is also called. I think this is correct. So what is the correct routine to receive some data from backend? How does this work? Can anyone help me with that. I will appreciate it very much. Thanks, Jin Yang
[Qemu-devel] CAN device
Hi, I try to develop a CAN device on QEMU. And I found pci-serial is similar to CAN. Untill now, I have some questions about how to use pci-serial on QEMU. Actually, QEMU use isa-serial as a default serial device. So I try to use isa-serial firstly. Some useful information we can get from docs/qdev-device-use.txt. I know that we should use "-chardev" argument to create a host part, and then use "-device isa-serial,iobase=IOADDR,irq=IRQ,index=IDX" to start a isa-serial. I get those arguments from the source file, the following can work. "-device isa-serial,chardev=isa0,iobase=0x3f8,irq=4,index=0" However, when I try to create a host through "-chardev serial,id=isa0,path=./", error "chardev: opening backend "serial" failed" occurs. When change it to "-chardev serial,id=isa0,path=/dev/ttyS0", it works. Now, I donot know what "path" means? Does it have some relation to the host device? Or it's just a symbol means nothing. And some questions about pci bus. On docs/qdev-device-use.txt, we get Example: device i440FX-pcihost is on the root bus, and provides a PCI bus named pci.0. To put a FOO device into its slot 4, use -device FOO,bus=/i440FX-pcihost/pci.0,addr=4. The abbreviated form bus=pci.0 also works as long as the bus name is unique. So, how can we get the name of the root device which we use now? I searched that for some days, but doesnot get some usefull information. Thanks, Jin yang.
Re: [Qemu-devel] CAN device
Hi, Thanks, Andreas. It really help me a lot. When I man qemu, I found "path specifies the name of the serial device to open". Does that mean I should have a real serial device or I cannot test it? Can I test it just in a virtual environment? When I try to open a /dev/ttyS0 through "cat /dev/ttyS0", error "Input/output error". I google it, and found many reasons can cause that error. How should I test it? Thanks, Jin Yang. 2013/6/28 Andreas Färber > Hi, > > Am 28.06.2013 14:19, schrieb Yang Jin: > > I try to develop a CAN device on QEMU. And I found pci-serial is similar > > to CAN. > > > > Untill now, I have some questions about how to use pci-serial on QEMU. > > Actually, QEMU use isa-serial as a default serial device. So I try to > > use isa-serial firstly. > > > > Some useful information we can get from docs/qdev-device-use.txt. I know > > that we should use "-chardev" argument to create a host part, and then > > use "-device isa-serial,iobase=IOADDR,irq=IRQ,index=IDX" to start a > > isa-serial. I get those arguments from the source file, the following > > can work. > >"-device isa-serial,chardev=isa0,iobase=0x3f8,irq=4,index=0" > > However, when I try to create a host through "-chardev > > serial,id=isa0,path=./", error "chardev: opening backend "serial" > > failed" occurs. When change it to "-chardev > > serial,id=isa0,path=/dev/ttyS0", it works. Now, I donot know what "path" > > means? Does it have some relation to the host device? Or it's just a > > symbol means nothing. > > Searching man qemu for "chardev serial" should answer that question. :) > There you will also find alternative chardev backends you can use. > > > And some questions about pci bus. On docs/qdev-device-use.txt, we get > > Example: device i440FX-pcihost is on the root bus, and provides a PCI > > bus named pci.0. To put a FOO device into its slot 4, use -device > > FOO,bus=/i440FX-pcihost/pci.0,addr=4. The abbreviated form bus=pci.0 > > also works as long as the bus name is unique. > > So, how can we get the name of the root device which we use now? > > You can browse the QOM hierarchy using the ./QMP/qom-list script and an > appropriate -qmp option (e.g. unix:./qmp-sock,server,nowait). > > But leaving out the bus= option should work fine just as well. > > Regards, > Andreas > > > I searched that for some days, but doesnot get some usefull information. > > > > Thanks, > > Jin yang. > > -- > SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany > GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg >