Thread (6 messages) 6 messages, 3 authors, 2009-04-20

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help