Re: HowTo write a driver for 2 multiplexed PS/2 ports over 1 UART?
flat view
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2009-04-18 23:46:07
Hi Heiko, On Thu, Apr 16, 2009 at 08:22:34AM +0200, Heiko Schocher wrote:
Hello, I maybe get a projekt, where I have 2 PS/2 ports (a keyboard and a mousse) connected to one UART and the multiplexing is done by a PIC. I searched in actual 2.6 Kernel sources for such a solution, but couln;t find one. Overlooked I something? For 2.4er Kernel there was such a driver, see http://git.denx.de/?p=linuxppc_2_4_devel.git;a=blob;f=drivers/char/ps2mult.c but, I think, this is no longer portable to 2.6. So, thats why I am here and want to ask the experts how to solve this problem in a mainline acceptable way, before I make a hack, that never has a chance to go in mainline. Some suggestions from me (maybe they are all bad) I looked in drivers/input/serio/serio.c and could think of adding the multiplexing in serio_interrupt(), and call serio_driver specific serio->drv->interrupt functions, when I know, which byte come from which device. But, if I see it right, I can only add one "struct serio_driver *drv;" driver to one serio port, so it is not possible to handle 2 or more devices over one serio port :-( Maybe we enhance this too ... ? Or I make a combinated (keyboard/mousse) driver which uses one serio port ... but I think thats a bad idea, also no idea, in which directory i have to add such a driver. So I think it would nice to have the possibility to add more than one serio_driver to a serio_port and add a "multiplexer" layer ... but I am new to the input layer, so I ask the experts. Hopefully I just missed something in actual code, and there is better/easier way? ;-)
You need to create 2 serio ports in your driver and have it send data into appropriate port, depending on what device it came from. If you take a look at i8042 driver it does exactly that. We have 1 serio port for keyboard and eithe 1 or 4 AUX serio ports. In i8042_interrupt we check the status bit to figure to which serio port incoming byte should be routed and act accordingly. Hope this helps. -- Dmitry