QEMU Microsoft serial mouse emulation
Adds "msmouse" character device, which emulates a serial mouse. Use it with -serial msmouse. Signed-Off-By: Lubomir Rintel <lkundrak@v3.sk> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6559 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									d5853c20f2
								
							
						
					
					
						commit
						aa71cf802e
					
				| @ -574,6 +574,9 @@ OBJS += pcnet.o | ||||
| OBJS += rtl8139.o | ||||
| OBJS += e1000.o | ||||
| 
 | ||||
| # Serial mouse
 | ||||
| OBJS += msmouse.o | ||||
| 
 | ||||
| ifeq ($(TARGET_BASE_ARCH), i386) | ||||
| # Hardware support
 | ||||
| OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o | ||||
|  | ||||
							
								
								
									
										78
									
								
								hw/msmouse.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								hw/msmouse.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| /*
 | ||||
|  * QEMU Microsoft serial mouse emulation | ||||
|  * | ||||
|  * Copyright (c) 2008 Lubomir Rintel | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| #include <stdlib.h> | ||||
| #include "../qemu-common.h" | ||||
| #include "../qemu-char.h" | ||||
| #include "../console.h" | ||||
| #include "msmouse.h" | ||||
| 
 | ||||
| #define MSMOUSE_LO6(n) ((n) & 0x3f) | ||||
| #define MSMOUSE_HI2(n) (((n) & 0xc0) >> 6) | ||||
| 
 | ||||
| static void msmouse_event(void *opaque, | ||||
|                           int dx, int dy, int dz, int buttons_state) | ||||
| { | ||||
|     CharDriverState *chr = (CharDriverState *)opaque; | ||||
| 
 | ||||
|     unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 }; | ||||
| 
 | ||||
|     /* Movement deltas */ | ||||
|     bytes[0] |= (MSMOUSE_HI2(dy) << 2) | MSMOUSE_HI2(dx); | ||||
|     bytes[1] |= MSMOUSE_LO6(dx); | ||||
|     bytes[2] |= MSMOUSE_LO6(dy); | ||||
| 
 | ||||
|     /* Buttons */ | ||||
|     bytes[0] |= (buttons_state & 0x01 ? 0x20 : 0x00); | ||||
|     bytes[0] |= (buttons_state & 0x02 ? 0x10 : 0x00); | ||||
|     bytes[3] |= (buttons_state & 0x04 ? 0x20 : 0x00); | ||||
| 
 | ||||
|     /* We always send the packet of, so that we do not have to keep track
 | ||||
|        of previous state of the middle button. This can potentially confuse | ||||
|        some very old drivers for two button mice though. */ | ||||
|     qemu_chr_read(chr, bytes, 4); | ||||
| } | ||||
| 
 | ||||
| static int msmouse_chr_write (struct CharDriverState *s, const uint8_t *buf, int len) | ||||
| { | ||||
|     /* Ignore writes to mouse port */ | ||||
|     return len; | ||||
| } | ||||
| 
 | ||||
| static void msmouse_chr_close (struct CharDriverState *chr) | ||||
| { | ||||
|     qemu_free (chr); | ||||
| } | ||||
| 
 | ||||
| CharDriverState *qemu_chr_open_msmouse(void) | ||||
| { | ||||
|     CharDriverState *chr; | ||||
| 
 | ||||
|     chr = qemu_mallocz(sizeof(CharDriverState)); | ||||
|     chr->chr_write = msmouse_chr_write; | ||||
|     chr->chr_close = msmouse_chr_close; | ||||
| 
 | ||||
|     qemu_add_mouse_event_handler(msmouse_event, chr, 0, "QEMU Microsoft Mouse"); | ||||
| 
 | ||||
|     return chr; | ||||
| } | ||||
							
								
								
									
										2
									
								
								hw/msmouse.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								hw/msmouse.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| /* msmouse.c */ | ||||
| CharDriverState *qemu_chr_open_msmouse(void); | ||||
| @ -30,6 +30,7 @@ | ||||
| #include "block.h" | ||||
| #include "hw/usb.h" | ||||
| #include "hw/baum.h" | ||||
| #include "hw/msmouse.h" | ||||
| 
 | ||||
| #include <unistd.h> | ||||
| #include <fcntl.h> | ||||
| @ -2105,6 +2106,8 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*i | ||||
|         } else { | ||||
|             printf("Unable to open driver: %s\n", p); | ||||
|         } | ||||
|     } else if (!strcmp(filename, "msmouse")) { | ||||
|         chr = qemu_chr_open_msmouse(); | ||||
|     } else | ||||
| #ifndef _WIN32 | ||||
|     if (strstart(filename, "unix:", &p)) { | ||||
|  | ||||
| @ -961,6 +961,8 @@ This implements UDP Net Console. | ||||
| When @var{remote_host} or @var{src_ip} are not specified | ||||
| they default to @code{0.0.0.0}. | ||||
| When not using a specified @var{src_port} a random port is automatically chosen. | ||||
| @item msmouse | ||||
| Three button serial mouse. Configure the guest to use Microsoft protocol. | ||||
| 
 | ||||
| If you just want a simple readonly console you can use @code{netcat} or | ||||
| @code{nc}, by starting qemu with: @code{-serial udp::4555} and nc as: | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 aurel32
						aurel32