(2006-08-06) rescue-bootcd
This commit is contained in:
1
extra/linux-2.6.10/drivers/input/mouse/.built-in.o.cmd
Normal file
1
extra/linux-2.6.10/drivers/input/mouse/.built-in.o.cmd
Normal file
@@ -0,0 +1 @@
|
||||
cmd_drivers/input/mouse/built-in.o := ld -m elf_i386 -r -o drivers/input/mouse/built-in.o drivers/input/mouse/psmouse.o
|
||||
246
extra/linux-2.6.10/drivers/input/mouse/.logips2pp.o.cmd
Normal file
246
extra/linux-2.6.10/drivers/input/mouse/.logips2pp.o.cmd
Normal file
@@ -0,0 +1,246 @@
|
||||
cmd_drivers/input/mouse/logips2pp.o := gcc -Wp,-MD,drivers/input/mouse/.logips2pp.o.d -nostdinc -iwithprefix include -D__KERNEL__ -Iinclude -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O2 -fomit-frame-pointer -pipe -msoft-float -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=pentium-mmx -Iinclude/asm-i386/mach-default -Wdeclaration-after-statement -DKBUILD_BASENAME=logips2pp -DKBUILD_MODNAME=psmouse -c -o drivers/input/mouse/logips2pp.o drivers/input/mouse/logips2pp.c
|
||||
|
||||
deps_drivers/input/mouse/logips2pp.o := \
|
||||
drivers/input/mouse/logips2pp.c \
|
||||
include/linux/input.h \
|
||||
include/linux/time.h \
|
||||
include/linux/types.h \
|
||||
$(wildcard include/config/uid16.h) \
|
||||
include/linux/config.h \
|
||||
$(wildcard include/config/h.h) \
|
||||
include/linux/posix_types.h \
|
||||
include/linux/stddef.h \
|
||||
include/linux/compiler.h \
|
||||
include/linux/compiler-gcc3.h \
|
||||
include/linux/compiler-gcc.h \
|
||||
include/asm/posix_types.h \
|
||||
include/asm/types.h \
|
||||
$(wildcard include/config/highmem64g.h) \
|
||||
$(wildcard include/config/lbd.h) \
|
||||
include/linux/seqlock.h \
|
||||
include/linux/spinlock.h \
|
||||
$(wildcard include/config/smp.h) \
|
||||
$(wildcard include/config/preempt.h) \
|
||||
$(wildcard include/config/debug/spinlock.h) \
|
||||
$(wildcard include/config/lockmeter.h) \
|
||||
include/linux/preempt.h \
|
||||
include/linux/linkage.h \
|
||||
include/asm/linkage.h \
|
||||
$(wildcard include/config/regparm.h) \
|
||||
$(wildcard include/config/x86/alignment/16.h) \
|
||||
include/linux/thread_info.h \
|
||||
include/linux/bitops.h \
|
||||
include/asm/bitops.h \
|
||||
include/asm/thread_info.h \
|
||||
$(wildcard include/config/4kstacks.h) \
|
||||
$(wildcard include/config/debug/stack/usage.h) \
|
||||
include/asm/page.h \
|
||||
$(wildcard include/config/x86/use/3dnow.h) \
|
||||
$(wildcard include/config/x86/pae.h) \
|
||||
$(wildcard include/config/hugetlb/page.h) \
|
||||
$(wildcard include/config/highmem4g.h) \
|
||||
$(wildcard include/config/discontigmem.h) \
|
||||
include/asm/processor.h \
|
||||
$(wildcard include/config/mk8.h) \
|
||||
$(wildcard include/config/mk7.h) \
|
||||
include/asm/vm86.h \
|
||||
include/asm/math_emu.h \
|
||||
include/asm/sigcontext.h \
|
||||
include/asm/segment.h \
|
||||
include/asm/cpufeature.h \
|
||||
include/asm/msr.h \
|
||||
include/asm/system.h \
|
||||
$(wildcard include/config/x86/cmpxchg.h) \
|
||||
$(wildcard include/config/x86/oostore.h) \
|
||||
include/linux/kernel.h \
|
||||
$(wildcard include/config/debug/spinlock/sleep.h) \
|
||||
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/include/stdarg.h \
|
||||
include/asm/byteorder.h \
|
||||
$(wildcard include/config/x86/bswap.h) \
|
||||
include/linux/byteorder/little_endian.h \
|
||||
include/linux/byteorder/swab.h \
|
||||
include/linux/byteorder/generic.h \
|
||||
include/asm/bug.h \
|
||||
include/asm-generic/bug.h \
|
||||
include/linux/cache.h \
|
||||
include/asm/cache.h \
|
||||
$(wildcard include/config/x86/l1/cache/shift.h) \
|
||||
include/linux/threads.h \
|
||||
$(wildcard include/config/nr/cpus.h) \
|
||||
include/asm/percpu.h \
|
||||
include/asm-generic/percpu.h \
|
||||
include/linux/stringify.h \
|
||||
include/linux/list.h \
|
||||
include/linux/prefetch.h \
|
||||
include/linux/fs.h \
|
||||
$(wildcard include/config/dnotify.h) \
|
||||
$(wildcard include/config/quota.h) \
|
||||
$(wildcard include/config/epoll.h) \
|
||||
$(wildcard include/config/auditsyscall.h) \
|
||||
$(wildcard include/config/security.h) \
|
||||
include/linux/limits.h \
|
||||
include/linux/wait.h \
|
||||
include/asm/current.h \
|
||||
include/linux/kdev_t.h \
|
||||
include/linux/ioctl.h \
|
||||
include/asm/ioctl.h \
|
||||
include/linux/dcache.h \
|
||||
include/asm/atomic.h \
|
||||
$(wildcard include/config/m386.h) \
|
||||
include/linux/rcupdate.h \
|
||||
include/linux/percpu.h \
|
||||
include/linux/slab.h \
|
||||
$(wildcard include/config/.h) \
|
||||
$(wildcard include/config/numa.h) \
|
||||
include/linux/gfp.h \
|
||||
include/linux/mmzone.h \
|
||||
$(wildcard include/config/force/max/zoneorder.h) \
|
||||
include/linux/numa.h \
|
||||
include/linux/topology.h \
|
||||
$(wildcard include/config/sched/smt.h) \
|
||||
include/linux/cpumask.h \
|
||||
$(wildcard include/config/hotplug/cpu.h) \
|
||||
include/linux/bitmap.h \
|
||||
include/linux/string.h \
|
||||
include/asm/string.h \
|
||||
include/linux/smp.h \
|
||||
include/asm/topology.h \
|
||||
include/asm-generic/topology.h \
|
||||
include/linux/init.h \
|
||||
$(wildcard include/config/modules.h) \
|
||||
$(wildcard include/config/hotplug.h) \
|
||||
include/linux/kmalloc_sizes.h \
|
||||
$(wildcard include/config/mmu.h) \
|
||||
$(wildcard include/config/large/allocs.h) \
|
||||
include/linux/stat.h \
|
||||
include/asm/stat.h \
|
||||
include/linux/prio_tree.h \
|
||||
include/linux/kobject.h \
|
||||
include/linux/sysfs.h \
|
||||
$(wildcard include/config/sysfs.h) \
|
||||
include/linux/rwsem.h \
|
||||
$(wildcard include/config/rwsem/generic/spinlock.h) \
|
||||
include/asm/rwsem.h \
|
||||
include/linux/kref.h \
|
||||
include/linux/kobject_uevent.h \
|
||||
$(wildcard include/config/kobject/uevent.h) \
|
||||
include/linux/radix-tree.h \
|
||||
include/linux/audit.h \
|
||||
$(wildcard include/config/audit.h) \
|
||||
include/asm/semaphore.h \
|
||||
include/linux/quota.h \
|
||||
include/linux/errno.h \
|
||||
include/asm/errno.h \
|
||||
include/asm-generic/errno.h \
|
||||
include/asm-generic/errno-base.h \
|
||||
include/linux/dqblk_xfs.h \
|
||||
include/linux/dqblk_v1.h \
|
||||
include/linux/dqblk_v2.h \
|
||||
include/linux/nfs_fs_i.h \
|
||||
include/linux/nfs.h \
|
||||
include/linux/sunrpc/msg_prot.h \
|
||||
include/linux/fcntl.h \
|
||||
include/asm/fcntl.h \
|
||||
include/linux/err.h \
|
||||
include/linux/timer.h \
|
||||
include/linux/serio.h \
|
||||
include/linux/interrupt.h \
|
||||
$(wildcard include/config/generic/hardirqs.h) \
|
||||
$(wildcard include/config/generic/irq/probe.h) \
|
||||
include/linux/hardirq.h \
|
||||
include/linux/smp_lock.h \
|
||||
$(wildcard include/config/lock/kernel.h) \
|
||||
include/linux/sched.h \
|
||||
$(wildcard include/config/keys.h) \
|
||||
$(wildcard include/config/schedstats.h) \
|
||||
$(wildcard include/config/magic/sysrq.h) \
|
||||
include/asm/param.h \
|
||||
include/linux/capability.h \
|
||||
include/linux/timex.h \
|
||||
$(wildcard include/config/time/interpolation.h) \
|
||||
include/asm/timex.h \
|
||||
$(wildcard include/config/x86/elan.h) \
|
||||
$(wildcard include/config/x86/tsc.h) \
|
||||
$(wildcard include/config/x86/generic.h) \
|
||||
include/linux/jiffies.h \
|
||||
include/asm/div64.h \
|
||||
include/linux/rbtree.h \
|
||||
include/asm/ptrace.h \
|
||||
$(wildcard include/config/frame/pointer.h) \
|
||||
include/asm/mmu.h \
|
||||
include/linux/sem.h \
|
||||
$(wildcard include/config/sysvipc.h) \
|
||||
include/linux/ipc.h \
|
||||
include/asm/ipcbuf.h \
|
||||
include/asm/sembuf.h \
|
||||
include/linux/signal.h \
|
||||
include/asm/signal.h \
|
||||
include/asm/siginfo.h \
|
||||
include/asm-generic/siginfo.h \
|
||||
include/linux/resource.h \
|
||||
include/asm/resource.h \
|
||||
include/linux/securebits.h \
|
||||
include/linux/fs_struct.h \
|
||||
include/linux/completion.h \
|
||||
include/linux/pid.h \
|
||||
include/linux/param.h \
|
||||
include/linux/aio.h \
|
||||
include/linux/workqueue.h \
|
||||
include/linux/aio_abi.h \
|
||||
include/asm/hardirq.h \
|
||||
include/linux/irq.h \
|
||||
$(wildcard include/config/arch/s390.h) \
|
||||
include/asm/irq.h \
|
||||
$(wildcard include/config/x86/local/apic.h) \
|
||||
$(wildcard include/config/irqbalance.h) \
|
||||
include/asm-i386/mach-default/irq_vectors.h \
|
||||
include/asm-i386/mach-default/irq_vectors_limits.h \
|
||||
$(wildcard include/config/pci/msi.h) \
|
||||
$(wildcard include/config/x86/io/apic.h) \
|
||||
include/asm/hw_irq.h \
|
||||
include/linux/profile.h \
|
||||
$(wildcard include/config/proc/fs.h) \
|
||||
$(wildcard include/config/profiling.h) \
|
||||
include/asm/sections.h \
|
||||
include/asm-generic/sections.h \
|
||||
include/linux/irq_cpustat.h \
|
||||
include/linux/device.h \
|
||||
include/linux/ioport.h \
|
||||
include/linux/module.h \
|
||||
$(wildcard include/config/modversions.h) \
|
||||
$(wildcard include/config/module/unload.h) \
|
||||
$(wildcard include/config/kallsyms.h) \
|
||||
include/linux/kmod.h \
|
||||
$(wildcard include/config/kmod.h) \
|
||||
include/linux/elf.h \
|
||||
include/asm/elf.h \
|
||||
include/asm/user.h \
|
||||
include/linux/utsname.h \
|
||||
include/linux/moduleparam.h \
|
||||
include/asm/local.h \
|
||||
include/asm/module.h \
|
||||
$(wildcard include/config/m486.h) \
|
||||
$(wildcard include/config/m586.h) \
|
||||
$(wildcard include/config/m586tsc.h) \
|
||||
$(wildcard include/config/m586mmx.h) \
|
||||
$(wildcard include/config/m686.h) \
|
||||
$(wildcard include/config/mpentiumii.h) \
|
||||
$(wildcard include/config/mpentiumiii.h) \
|
||||
$(wildcard include/config/mpentiumm.h) \
|
||||
$(wildcard include/config/mpentium4.h) \
|
||||
$(wildcard include/config/mk6.h) \
|
||||
$(wildcard include/config/mcrusoe.h) \
|
||||
$(wildcard include/config/mefficeon.h) \
|
||||
$(wildcard include/config/mwinchipc6.h) \
|
||||
$(wildcard include/config/mwinchip2.h) \
|
||||
$(wildcard include/config/mwinchip3d.h) \
|
||||
$(wildcard include/config/mcyrixiii.h) \
|
||||
$(wildcard include/config/mviac3/2.h) \
|
||||
include/linux/pm.h \
|
||||
$(wildcard include/config/pm.h) \
|
||||
drivers/input/mouse/psmouse.h \
|
||||
drivers/input/mouse/logips2pp.h \
|
||||
|
||||
drivers/input/mouse/logips2pp.o: $(deps_drivers/input/mouse/logips2pp.o)
|
||||
|
||||
$(deps_drivers/input/mouse/logips2pp.o):
|
||||
249
extra/linux-2.6.10/drivers/input/mouse/.psmouse-base.o.cmd
Normal file
249
extra/linux-2.6.10/drivers/input/mouse/.psmouse-base.o.cmd
Normal file
@@ -0,0 +1,249 @@
|
||||
cmd_drivers/input/mouse/psmouse-base.o := gcc -Wp,-MD,drivers/input/mouse/.psmouse-base.o.d -nostdinc -iwithprefix include -D__KERNEL__ -Iinclude -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O2 -fomit-frame-pointer -pipe -msoft-float -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=pentium-mmx -Iinclude/asm-i386/mach-default -Wdeclaration-after-statement -DKBUILD_BASENAME=psmouse_base -DKBUILD_MODNAME=psmouse -c -o drivers/input/mouse/psmouse-base.o drivers/input/mouse/psmouse-base.c
|
||||
|
||||
deps_drivers/input/mouse/psmouse-base.o := \
|
||||
drivers/input/mouse/psmouse-base.c \
|
||||
include/linux/delay.h \
|
||||
include/asm/delay.h \
|
||||
include/linux/module.h \
|
||||
$(wildcard include/config/modules.h) \
|
||||
$(wildcard include/config/modversions.h) \
|
||||
$(wildcard include/config/module/unload.h) \
|
||||
$(wildcard include/config/kallsyms.h) \
|
||||
include/linux/config.h \
|
||||
$(wildcard include/config/h.h) \
|
||||
include/linux/sched.h \
|
||||
$(wildcard include/config/keys.h) \
|
||||
$(wildcard include/config/schedstats.h) \
|
||||
$(wildcard include/config/smp.h) \
|
||||
$(wildcard include/config/numa.h) \
|
||||
$(wildcard include/config/security.h) \
|
||||
$(wildcard include/config/preempt.h) \
|
||||
$(wildcard include/config/magic/sysrq.h) \
|
||||
include/asm/param.h \
|
||||
include/linux/capability.h \
|
||||
include/linux/types.h \
|
||||
$(wildcard include/config/uid16.h) \
|
||||
include/linux/posix_types.h \
|
||||
include/linux/stddef.h \
|
||||
include/linux/compiler.h \
|
||||
include/linux/compiler-gcc3.h \
|
||||
include/linux/compiler-gcc.h \
|
||||
include/asm/posix_types.h \
|
||||
include/asm/types.h \
|
||||
$(wildcard include/config/highmem64g.h) \
|
||||
$(wildcard include/config/lbd.h) \
|
||||
include/linux/spinlock.h \
|
||||
$(wildcard include/config/debug/spinlock.h) \
|
||||
$(wildcard include/config/lockmeter.h) \
|
||||
include/linux/preempt.h \
|
||||
include/linux/linkage.h \
|
||||
include/asm/linkage.h \
|
||||
$(wildcard include/config/regparm.h) \
|
||||
$(wildcard include/config/x86/alignment/16.h) \
|
||||
include/linux/thread_info.h \
|
||||
include/linux/bitops.h \
|
||||
include/asm/bitops.h \
|
||||
include/asm/thread_info.h \
|
||||
$(wildcard include/config/4kstacks.h) \
|
||||
$(wildcard include/config/debug/stack/usage.h) \
|
||||
include/asm/page.h \
|
||||
$(wildcard include/config/x86/use/3dnow.h) \
|
||||
$(wildcard include/config/x86/pae.h) \
|
||||
$(wildcard include/config/hugetlb/page.h) \
|
||||
$(wildcard include/config/highmem4g.h) \
|
||||
$(wildcard include/config/discontigmem.h) \
|
||||
include/asm/processor.h \
|
||||
$(wildcard include/config/mk8.h) \
|
||||
$(wildcard include/config/mk7.h) \
|
||||
include/asm/vm86.h \
|
||||
include/asm/math_emu.h \
|
||||
include/asm/sigcontext.h \
|
||||
include/asm/segment.h \
|
||||
include/asm/cpufeature.h \
|
||||
include/asm/msr.h \
|
||||
include/asm/system.h \
|
||||
$(wildcard include/config/x86/cmpxchg.h) \
|
||||
$(wildcard include/config/x86/oostore.h) \
|
||||
include/linux/kernel.h \
|
||||
$(wildcard include/config/debug/spinlock/sleep.h) \
|
||||
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/include/stdarg.h \
|
||||
include/asm/byteorder.h \
|
||||
$(wildcard include/config/x86/bswap.h) \
|
||||
include/linux/byteorder/little_endian.h \
|
||||
include/linux/byteorder/swab.h \
|
||||
include/linux/byteorder/generic.h \
|
||||
include/asm/bug.h \
|
||||
include/asm-generic/bug.h \
|
||||
include/linux/cache.h \
|
||||
include/asm/cache.h \
|
||||
$(wildcard include/config/x86/l1/cache/shift.h) \
|
||||
include/linux/threads.h \
|
||||
$(wildcard include/config/nr/cpus.h) \
|
||||
include/asm/percpu.h \
|
||||
include/asm-generic/percpu.h \
|
||||
include/linux/stringify.h \
|
||||
include/linux/timex.h \
|
||||
$(wildcard include/config/time/interpolation.h) \
|
||||
include/linux/time.h \
|
||||
include/linux/seqlock.h \
|
||||
include/asm/timex.h \
|
||||
$(wildcard include/config/x86/elan.h) \
|
||||
$(wildcard include/config/x86/tsc.h) \
|
||||
$(wildcard include/config/x86/generic.h) \
|
||||
include/linux/jiffies.h \
|
||||
include/asm/div64.h \
|
||||
include/linux/rbtree.h \
|
||||
include/linux/cpumask.h \
|
||||
$(wildcard include/config/hotplug/cpu.h) \
|
||||
include/linux/bitmap.h \
|
||||
include/linux/string.h \
|
||||
include/asm/string.h \
|
||||
include/asm/semaphore.h \
|
||||
include/asm/atomic.h \
|
||||
$(wildcard include/config/m386.h) \
|
||||
include/linux/wait.h \
|
||||
include/linux/list.h \
|
||||
include/linux/prefetch.h \
|
||||
include/asm/current.h \
|
||||
include/linux/rwsem.h \
|
||||
$(wildcard include/config/rwsem/generic/spinlock.h) \
|
||||
include/asm/rwsem.h \
|
||||
include/asm/ptrace.h \
|
||||
$(wildcard include/config/frame/pointer.h) \
|
||||
include/asm/mmu.h \
|
||||
include/linux/smp.h \
|
||||
include/linux/sem.h \
|
||||
$(wildcard include/config/sysvipc.h) \
|
||||
include/linux/ipc.h \
|
||||
include/asm/ipcbuf.h \
|
||||
include/asm/sembuf.h \
|
||||
include/linux/signal.h \
|
||||
include/asm/signal.h \
|
||||
include/asm/siginfo.h \
|
||||
include/asm-generic/siginfo.h \
|
||||
include/linux/resource.h \
|
||||
include/asm/resource.h \
|
||||
include/linux/securebits.h \
|
||||
include/linux/fs_struct.h \
|
||||
include/linux/completion.h \
|
||||
include/linux/pid.h \
|
||||
include/linux/percpu.h \
|
||||
include/linux/slab.h \
|
||||
$(wildcard include/config/.h) \
|
||||
include/linux/gfp.h \
|
||||
include/linux/mmzone.h \
|
||||
$(wildcard include/config/force/max/zoneorder.h) \
|
||||
include/linux/numa.h \
|
||||
include/linux/topology.h \
|
||||
$(wildcard include/config/sched/smt.h) \
|
||||
include/asm/topology.h \
|
||||
include/asm-generic/topology.h \
|
||||
include/linux/init.h \
|
||||
$(wildcard include/config/hotplug.h) \
|
||||
include/linux/kmalloc_sizes.h \
|
||||
$(wildcard include/config/mmu.h) \
|
||||
$(wildcard include/config/large/allocs.h) \
|
||||
include/linux/param.h \
|
||||
include/linux/timer.h \
|
||||
include/linux/aio.h \
|
||||
include/linux/workqueue.h \
|
||||
include/linux/aio_abi.h \
|
||||
include/linux/stat.h \
|
||||
include/asm/stat.h \
|
||||
include/linux/kmod.h \
|
||||
$(wildcard include/config/kmod.h) \
|
||||
include/linux/errno.h \
|
||||
include/asm/errno.h \
|
||||
include/asm-generic/errno.h \
|
||||
include/asm-generic/errno-base.h \
|
||||
include/linux/elf.h \
|
||||
include/asm/elf.h \
|
||||
include/asm/user.h \
|
||||
include/linux/utsname.h \
|
||||
include/linux/kobject.h \
|
||||
include/linux/sysfs.h \
|
||||
$(wildcard include/config/sysfs.h) \
|
||||
include/linux/kref.h \
|
||||
include/linux/kobject_uevent.h \
|
||||
$(wildcard include/config/kobject/uevent.h) \
|
||||
include/linux/moduleparam.h \
|
||||
include/asm/local.h \
|
||||
include/asm/module.h \
|
||||
$(wildcard include/config/m486.h) \
|
||||
$(wildcard include/config/m586.h) \
|
||||
$(wildcard include/config/m586tsc.h) \
|
||||
$(wildcard include/config/m586mmx.h) \
|
||||
$(wildcard include/config/m686.h) \
|
||||
$(wildcard include/config/mpentiumii.h) \
|
||||
$(wildcard include/config/mpentiumiii.h) \
|
||||
$(wildcard include/config/mpentiumm.h) \
|
||||
$(wildcard include/config/mpentium4.h) \
|
||||
$(wildcard include/config/mk6.h) \
|
||||
$(wildcard include/config/mcrusoe.h) \
|
||||
$(wildcard include/config/mefficeon.h) \
|
||||
$(wildcard include/config/mwinchipc6.h) \
|
||||
$(wildcard include/config/mwinchip2.h) \
|
||||
$(wildcard include/config/mwinchip3d.h) \
|
||||
$(wildcard include/config/mcyrixiii.h) \
|
||||
$(wildcard include/config/mviac3/2.h) \
|
||||
include/linux/interrupt.h \
|
||||
$(wildcard include/config/generic/hardirqs.h) \
|
||||
$(wildcard include/config/generic/irq/probe.h) \
|
||||
include/linux/hardirq.h \
|
||||
include/linux/smp_lock.h \
|
||||
$(wildcard include/config/lock/kernel.h) \
|
||||
include/asm/hardirq.h \
|
||||
include/linux/irq.h \
|
||||
$(wildcard include/config/arch/s390.h) \
|
||||
include/asm/irq.h \
|
||||
$(wildcard include/config/x86/local/apic.h) \
|
||||
$(wildcard include/config/irqbalance.h) \
|
||||
include/asm-i386/mach-default/irq_vectors.h \
|
||||
include/asm-i386/mach-default/irq_vectors_limits.h \
|
||||
$(wildcard include/config/pci/msi.h) \
|
||||
$(wildcard include/config/x86/io/apic.h) \
|
||||
include/asm/hw_irq.h \
|
||||
include/linux/profile.h \
|
||||
$(wildcard include/config/proc/fs.h) \
|
||||
$(wildcard include/config/profiling.h) \
|
||||
include/asm/sections.h \
|
||||
include/asm-generic/sections.h \
|
||||
include/linux/irq_cpustat.h \
|
||||
include/linux/input.h \
|
||||
include/linux/fs.h \
|
||||
$(wildcard include/config/dnotify.h) \
|
||||
$(wildcard include/config/quota.h) \
|
||||
$(wildcard include/config/epoll.h) \
|
||||
$(wildcard include/config/auditsyscall.h) \
|
||||
include/linux/limits.h \
|
||||
include/linux/kdev_t.h \
|
||||
include/linux/ioctl.h \
|
||||
include/asm/ioctl.h \
|
||||
include/linux/dcache.h \
|
||||
include/linux/rcupdate.h \
|
||||
include/linux/prio_tree.h \
|
||||
include/linux/radix-tree.h \
|
||||
include/linux/audit.h \
|
||||
$(wildcard include/config/audit.h) \
|
||||
include/linux/quota.h \
|
||||
include/linux/dqblk_xfs.h \
|
||||
include/linux/dqblk_v1.h \
|
||||
include/linux/dqblk_v2.h \
|
||||
include/linux/nfs_fs_i.h \
|
||||
include/linux/nfs.h \
|
||||
include/linux/sunrpc/msg_prot.h \
|
||||
include/linux/fcntl.h \
|
||||
include/asm/fcntl.h \
|
||||
include/linux/err.h \
|
||||
include/linux/serio.h \
|
||||
include/linux/device.h \
|
||||
include/linux/ioport.h \
|
||||
include/linux/pm.h \
|
||||
$(wildcard include/config/pm.h) \
|
||||
drivers/input/mouse/psmouse.h \
|
||||
drivers/input/mouse/synaptics.h \
|
||||
drivers/input/mouse/logips2pp.h \
|
||||
|
||||
drivers/input/mouse/psmouse-base.o: $(deps_drivers/input/mouse/psmouse-base.o)
|
||||
|
||||
$(deps_drivers/input/mouse/psmouse-base.o):
|
||||
1
extra/linux-2.6.10/drivers/input/mouse/.psmouse.o.cmd
Normal file
1
extra/linux-2.6.10/drivers/input/mouse/.psmouse.o.cmd
Normal file
@@ -0,0 +1 @@
|
||||
cmd_drivers/input/mouse/psmouse.o := ld -m elf_i386 -r -o drivers/input/mouse/psmouse.o drivers/input/mouse/psmouse-base.o drivers/input/mouse/logips2pp.o drivers/input/mouse/synaptics.o
|
||||
246
extra/linux-2.6.10/drivers/input/mouse/.synaptics.o.cmd
Normal file
246
extra/linux-2.6.10/drivers/input/mouse/.synaptics.o.cmd
Normal file
@@ -0,0 +1,246 @@
|
||||
cmd_drivers/input/mouse/synaptics.o := gcc -Wp,-MD,drivers/input/mouse/.synaptics.o.d -nostdinc -iwithprefix include -D__KERNEL__ -Iinclude -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O2 -fomit-frame-pointer -pipe -msoft-float -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=pentium-mmx -Iinclude/asm-i386/mach-default -Wdeclaration-after-statement -DKBUILD_BASENAME=synaptics -DKBUILD_MODNAME=psmouse -c -o drivers/input/mouse/synaptics.o drivers/input/mouse/synaptics.c
|
||||
|
||||
deps_drivers/input/mouse/synaptics.o := \
|
||||
drivers/input/mouse/synaptics.c \
|
||||
include/linux/module.h \
|
||||
$(wildcard include/config/modules.h) \
|
||||
$(wildcard include/config/modversions.h) \
|
||||
$(wildcard include/config/module/unload.h) \
|
||||
$(wildcard include/config/kallsyms.h) \
|
||||
include/linux/config.h \
|
||||
$(wildcard include/config/h.h) \
|
||||
include/linux/sched.h \
|
||||
$(wildcard include/config/keys.h) \
|
||||
$(wildcard include/config/schedstats.h) \
|
||||
$(wildcard include/config/smp.h) \
|
||||
$(wildcard include/config/numa.h) \
|
||||
$(wildcard include/config/security.h) \
|
||||
$(wildcard include/config/preempt.h) \
|
||||
$(wildcard include/config/magic/sysrq.h) \
|
||||
include/asm/param.h \
|
||||
include/linux/capability.h \
|
||||
include/linux/types.h \
|
||||
$(wildcard include/config/uid16.h) \
|
||||
include/linux/posix_types.h \
|
||||
include/linux/stddef.h \
|
||||
include/linux/compiler.h \
|
||||
include/linux/compiler-gcc3.h \
|
||||
include/linux/compiler-gcc.h \
|
||||
include/asm/posix_types.h \
|
||||
include/asm/types.h \
|
||||
$(wildcard include/config/highmem64g.h) \
|
||||
$(wildcard include/config/lbd.h) \
|
||||
include/linux/spinlock.h \
|
||||
$(wildcard include/config/debug/spinlock.h) \
|
||||
$(wildcard include/config/lockmeter.h) \
|
||||
include/linux/preempt.h \
|
||||
include/linux/linkage.h \
|
||||
include/asm/linkage.h \
|
||||
$(wildcard include/config/regparm.h) \
|
||||
$(wildcard include/config/x86/alignment/16.h) \
|
||||
include/linux/thread_info.h \
|
||||
include/linux/bitops.h \
|
||||
include/asm/bitops.h \
|
||||
include/asm/thread_info.h \
|
||||
$(wildcard include/config/4kstacks.h) \
|
||||
$(wildcard include/config/debug/stack/usage.h) \
|
||||
include/asm/page.h \
|
||||
$(wildcard include/config/x86/use/3dnow.h) \
|
||||
$(wildcard include/config/x86/pae.h) \
|
||||
$(wildcard include/config/hugetlb/page.h) \
|
||||
$(wildcard include/config/highmem4g.h) \
|
||||
$(wildcard include/config/discontigmem.h) \
|
||||
include/asm/processor.h \
|
||||
$(wildcard include/config/mk8.h) \
|
||||
$(wildcard include/config/mk7.h) \
|
||||
include/asm/vm86.h \
|
||||
include/asm/math_emu.h \
|
||||
include/asm/sigcontext.h \
|
||||
include/asm/segment.h \
|
||||
include/asm/cpufeature.h \
|
||||
include/asm/msr.h \
|
||||
include/asm/system.h \
|
||||
$(wildcard include/config/x86/cmpxchg.h) \
|
||||
$(wildcard include/config/x86/oostore.h) \
|
||||
include/linux/kernel.h \
|
||||
$(wildcard include/config/debug/spinlock/sleep.h) \
|
||||
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/include/stdarg.h \
|
||||
include/asm/byteorder.h \
|
||||
$(wildcard include/config/x86/bswap.h) \
|
||||
include/linux/byteorder/little_endian.h \
|
||||
include/linux/byteorder/swab.h \
|
||||
include/linux/byteorder/generic.h \
|
||||
include/asm/bug.h \
|
||||
include/asm-generic/bug.h \
|
||||
include/linux/cache.h \
|
||||
include/asm/cache.h \
|
||||
$(wildcard include/config/x86/l1/cache/shift.h) \
|
||||
include/linux/threads.h \
|
||||
$(wildcard include/config/nr/cpus.h) \
|
||||
include/asm/percpu.h \
|
||||
include/asm-generic/percpu.h \
|
||||
include/linux/stringify.h \
|
||||
include/linux/timex.h \
|
||||
$(wildcard include/config/time/interpolation.h) \
|
||||
include/linux/time.h \
|
||||
include/linux/seqlock.h \
|
||||
include/asm/timex.h \
|
||||
$(wildcard include/config/x86/elan.h) \
|
||||
$(wildcard include/config/x86/tsc.h) \
|
||||
$(wildcard include/config/x86/generic.h) \
|
||||
include/linux/jiffies.h \
|
||||
include/asm/div64.h \
|
||||
include/linux/rbtree.h \
|
||||
include/linux/cpumask.h \
|
||||
$(wildcard include/config/hotplug/cpu.h) \
|
||||
include/linux/bitmap.h \
|
||||
include/linux/string.h \
|
||||
include/asm/string.h \
|
||||
include/asm/semaphore.h \
|
||||
include/asm/atomic.h \
|
||||
$(wildcard include/config/m386.h) \
|
||||
include/linux/wait.h \
|
||||
include/linux/list.h \
|
||||
include/linux/prefetch.h \
|
||||
include/asm/current.h \
|
||||
include/linux/rwsem.h \
|
||||
$(wildcard include/config/rwsem/generic/spinlock.h) \
|
||||
include/asm/rwsem.h \
|
||||
include/asm/ptrace.h \
|
||||
$(wildcard include/config/frame/pointer.h) \
|
||||
include/asm/mmu.h \
|
||||
include/linux/smp.h \
|
||||
include/linux/sem.h \
|
||||
$(wildcard include/config/sysvipc.h) \
|
||||
include/linux/ipc.h \
|
||||
include/asm/ipcbuf.h \
|
||||
include/asm/sembuf.h \
|
||||
include/linux/signal.h \
|
||||
include/asm/signal.h \
|
||||
include/asm/siginfo.h \
|
||||
include/asm-generic/siginfo.h \
|
||||
include/linux/resource.h \
|
||||
include/asm/resource.h \
|
||||
include/linux/securebits.h \
|
||||
include/linux/fs_struct.h \
|
||||
include/linux/completion.h \
|
||||
include/linux/pid.h \
|
||||
include/linux/percpu.h \
|
||||
include/linux/slab.h \
|
||||
$(wildcard include/config/.h) \
|
||||
include/linux/gfp.h \
|
||||
include/linux/mmzone.h \
|
||||
$(wildcard include/config/force/max/zoneorder.h) \
|
||||
include/linux/numa.h \
|
||||
include/linux/topology.h \
|
||||
$(wildcard include/config/sched/smt.h) \
|
||||
include/asm/topology.h \
|
||||
include/asm-generic/topology.h \
|
||||
include/linux/init.h \
|
||||
$(wildcard include/config/hotplug.h) \
|
||||
include/linux/kmalloc_sizes.h \
|
||||
$(wildcard include/config/mmu.h) \
|
||||
$(wildcard include/config/large/allocs.h) \
|
||||
include/linux/param.h \
|
||||
include/linux/timer.h \
|
||||
include/linux/aio.h \
|
||||
include/linux/workqueue.h \
|
||||
include/linux/aio_abi.h \
|
||||
include/linux/stat.h \
|
||||
include/asm/stat.h \
|
||||
include/linux/kmod.h \
|
||||
$(wildcard include/config/kmod.h) \
|
||||
include/linux/errno.h \
|
||||
include/asm/errno.h \
|
||||
include/asm-generic/errno.h \
|
||||
include/asm-generic/errno-base.h \
|
||||
include/linux/elf.h \
|
||||
include/asm/elf.h \
|
||||
include/asm/user.h \
|
||||
include/linux/utsname.h \
|
||||
include/linux/kobject.h \
|
||||
include/linux/sysfs.h \
|
||||
$(wildcard include/config/sysfs.h) \
|
||||
include/linux/kref.h \
|
||||
include/linux/kobject_uevent.h \
|
||||
$(wildcard include/config/kobject/uevent.h) \
|
||||
include/linux/moduleparam.h \
|
||||
include/asm/local.h \
|
||||
include/asm/module.h \
|
||||
$(wildcard include/config/m486.h) \
|
||||
$(wildcard include/config/m586.h) \
|
||||
$(wildcard include/config/m586tsc.h) \
|
||||
$(wildcard include/config/m586mmx.h) \
|
||||
$(wildcard include/config/m686.h) \
|
||||
$(wildcard include/config/mpentiumii.h) \
|
||||
$(wildcard include/config/mpentiumiii.h) \
|
||||
$(wildcard include/config/mpentiumm.h) \
|
||||
$(wildcard include/config/mpentium4.h) \
|
||||
$(wildcard include/config/mk6.h) \
|
||||
$(wildcard include/config/mcrusoe.h) \
|
||||
$(wildcard include/config/mefficeon.h) \
|
||||
$(wildcard include/config/mwinchipc6.h) \
|
||||
$(wildcard include/config/mwinchip2.h) \
|
||||
$(wildcard include/config/mwinchip3d.h) \
|
||||
$(wildcard include/config/mcyrixiii.h) \
|
||||
$(wildcard include/config/mviac3/2.h) \
|
||||
include/linux/input.h \
|
||||
include/linux/fs.h \
|
||||
$(wildcard include/config/dnotify.h) \
|
||||
$(wildcard include/config/quota.h) \
|
||||
$(wildcard include/config/epoll.h) \
|
||||
$(wildcard include/config/auditsyscall.h) \
|
||||
include/linux/limits.h \
|
||||
include/linux/kdev_t.h \
|
||||
include/linux/ioctl.h \
|
||||
include/asm/ioctl.h \
|
||||
include/linux/dcache.h \
|
||||
include/linux/rcupdate.h \
|
||||
include/linux/prio_tree.h \
|
||||
include/linux/radix-tree.h \
|
||||
include/linux/audit.h \
|
||||
$(wildcard include/config/audit.h) \
|
||||
include/linux/quota.h \
|
||||
include/linux/dqblk_xfs.h \
|
||||
include/linux/dqblk_v1.h \
|
||||
include/linux/dqblk_v2.h \
|
||||
include/linux/nfs_fs_i.h \
|
||||
include/linux/nfs.h \
|
||||
include/linux/sunrpc/msg_prot.h \
|
||||
include/linux/fcntl.h \
|
||||
include/asm/fcntl.h \
|
||||
include/linux/err.h \
|
||||
include/linux/serio.h \
|
||||
include/linux/interrupt.h \
|
||||
$(wildcard include/config/generic/hardirqs.h) \
|
||||
$(wildcard include/config/generic/irq/probe.h) \
|
||||
include/linux/hardirq.h \
|
||||
include/linux/smp_lock.h \
|
||||
$(wildcard include/config/lock/kernel.h) \
|
||||
include/asm/hardirq.h \
|
||||
include/linux/irq.h \
|
||||
$(wildcard include/config/arch/s390.h) \
|
||||
include/asm/irq.h \
|
||||
$(wildcard include/config/x86/local/apic.h) \
|
||||
$(wildcard include/config/irqbalance.h) \
|
||||
include/asm-i386/mach-default/irq_vectors.h \
|
||||
include/asm-i386/mach-default/irq_vectors_limits.h \
|
||||
$(wildcard include/config/pci/msi.h) \
|
||||
$(wildcard include/config/x86/io/apic.h) \
|
||||
include/asm/hw_irq.h \
|
||||
include/linux/profile.h \
|
||||
$(wildcard include/config/proc/fs.h) \
|
||||
$(wildcard include/config/profiling.h) \
|
||||
include/asm/sections.h \
|
||||
include/asm-generic/sections.h \
|
||||
include/linux/irq_cpustat.h \
|
||||
include/linux/device.h \
|
||||
include/linux/ioport.h \
|
||||
include/linux/pm.h \
|
||||
$(wildcard include/config/pm.h) \
|
||||
drivers/input/mouse/psmouse.h \
|
||||
drivers/input/mouse/synaptics.h \
|
||||
|
||||
drivers/input/mouse/synaptics.o: $(deps_drivers/input/mouse/synaptics.o)
|
||||
|
||||
$(deps_drivers/input/mouse/synaptics.o):
|
||||
130
extra/linux-2.6.10/drivers/input/mouse/Kconfig
Normal file
130
extra/linux-2.6.10/drivers/input/mouse/Kconfig
Normal file
@@ -0,0 +1,130 @@
|
||||
#
|
||||
# Mouse driver configuration
|
||||
#
|
||||
config INPUT_MOUSE
|
||||
bool "Mice"
|
||||
default y
|
||||
depends on INPUT
|
||||
help
|
||||
Say Y here, and a list of supported mice will be displayed.
|
||||
This option doesn't affect the kernel.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config MOUSE_PS2
|
||||
tristate "PS/2 mouse"
|
||||
default y
|
||||
depends on INPUT && INPUT_MOUSE
|
||||
select SERIO
|
||||
select SERIO_I8042 if PC
|
||||
select SERIO_GSCPS2 if GSC
|
||||
---help---
|
||||
Say Y here if you have a PS/2 mouse connected to your system. This
|
||||
includes the standard 2 or 3-button PS/2 mouse, as well as PS/2
|
||||
mice with wheels and extra buttons, Microsoft, Logitech or Genius
|
||||
compatible.
|
||||
|
||||
Synaptics TouchPad users might be interested in a specialized
|
||||
XFree86 driver at:
|
||||
http://w1.894.telia.com/~u89404340/touchpad/index.html
|
||||
and a new verion of GPM at:
|
||||
http://www.geocities.com/dt_or/gpm/gpm.html
|
||||
to take advantage of the advanced features of the touchpad.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called psmouse.
|
||||
|
||||
config MOUSE_SERIAL
|
||||
tristate "Serial mouse"
|
||||
depends on INPUT && INPUT_MOUSE
|
||||
select SERIO
|
||||
---help---
|
||||
Say Y here if you have a serial (RS-232, COM port) mouse connected
|
||||
to your system. This includes Sun, MouseSystems, Microsoft,
|
||||
Logitech and all other compatible serial mice.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called sermouse.
|
||||
|
||||
config MOUSE_INPORT
|
||||
tristate "InPort/MS/ATIXL busmouse"
|
||||
depends on INPUT && INPUT_MOUSE && ISA
|
||||
help
|
||||
Say Y here if you have an InPort, Microsoft or ATI XL busmouse.
|
||||
They are rather rare these days.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called inport.
|
||||
|
||||
config MOUSE_ATIXL
|
||||
bool "ATI XL variant"
|
||||
depends on MOUSE_INPORT
|
||||
help
|
||||
Say Y here if your mouse is of the ATI XL variety.
|
||||
|
||||
config MOUSE_LOGIBM
|
||||
tristate "Logitech busmouse"
|
||||
depends on INPUT && INPUT_MOUSE && ISA
|
||||
help
|
||||
Say Y here if you have a Logitech busmouse.
|
||||
They are rather rare these days.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called logibm.
|
||||
|
||||
config MOUSE_PC110PAD
|
||||
tristate "IBM PC110 touchpad"
|
||||
depends on INPUT && INPUT_MOUSE && ISA
|
||||
help
|
||||
Say Y if you have the IBM PC-110 micro-notebook and want its
|
||||
touchpad supported.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pc110pad.
|
||||
|
||||
config MOUSE_MAPLE
|
||||
tristate "Maple bus mouse"
|
||||
depends on SH_DREAMCAST && INPUT && INPUT_MOUSE && MAPLE
|
||||
help
|
||||
Say Y if you have a DreamCast console and a mouse attached to
|
||||
its Maple bus.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called maplemouse.
|
||||
|
||||
config MOUSE_AMIGA
|
||||
tristate "Amiga mouse"
|
||||
depends on AMIGA && INPUT && INPUT_MOUSE
|
||||
help
|
||||
Say Y here if you have an Amiga and want its native mouse
|
||||
supported by the kernel.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called amimouse.
|
||||
|
||||
config MOUSE_RISCPC
|
||||
tristate "Acorn RiscPC mouse"
|
||||
depends on ARCH_ACORN && INPUT && INPUT_MOUSE
|
||||
help
|
||||
Say Y here if you have the Acorn RiscPC computer and want its
|
||||
native mouse supported.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called rpcmouse.
|
||||
|
||||
config MOUSE_VSXXXAA
|
||||
tristate "DEC VSXXX-AA/GA mouse and VSXXX-AB tablet"
|
||||
depends on INPUT && INPUT_MOUSE
|
||||
select SERIO
|
||||
help
|
||||
Say Y (or M) if you want to use a DEC VSXXX-AA (hockey
|
||||
puck) or a VSXXX-GA (rectangular) mouse. Theses mice are
|
||||
typically used on DECstations or VAXstations, but can also
|
||||
be used on any box capable of RS232 (with some adaptor
|
||||
described in the source file). This driver also works with the
|
||||
digitizer (VSXXX-AB) DEC produced.
|
||||
|
||||
17
extra/linux-2.6.10/drivers/input/mouse/Makefile
Normal file
17
extra/linux-2.6.10/drivers/input/mouse/Makefile
Normal file
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# Makefile for the mouse drivers.
|
||||
#
|
||||
|
||||
# Each configuration option enables a list of files.
|
||||
|
||||
obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o
|
||||
obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o
|
||||
obj-$(CONFIG_MOUSE_INPORT) += inport.o
|
||||
obj-$(CONFIG_MOUSE_LOGIBM) += logibm.o
|
||||
obj-$(CONFIG_MOUSE_MAPLE) += maplemouse.o
|
||||
obj-$(CONFIG_MOUSE_PC110PAD) += pc110pad.o
|
||||
obj-$(CONFIG_MOUSE_PS2) += psmouse.o
|
||||
obj-$(CONFIG_MOUSE_SERIAL) += sermouse.o
|
||||
obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o
|
||||
|
||||
psmouse-objs := psmouse-base.o logips2pp.o synaptics.o
|
||||
137
extra/linux-2.6.10/drivers/input/mouse/amimouse.c
Normal file
137
extra/linux-2.6.10/drivers/input/mouse/amimouse.c
Normal file
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Amiga mouse driver for Linux/m68k
|
||||
*
|
||||
* Copyright (c) 2000-2002 Vojtech Pavlik
|
||||
*
|
||||
* Based on the work of:
|
||||
* Michael Rausch James Banks
|
||||
* Matther Dillon David Giller
|
||||
* Nathan Laredo Linus Torvalds
|
||||
* Johan Myreen Jes Sorensen
|
||||
* Russell King
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/amigahw.h>
|
||||
#include <asm/amigaints.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("Amiga mouse driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int amimouse_used = 0;
|
||||
static int amimouse_lastx, amimouse_lasty;
|
||||
static struct input_dev amimouse_dev;
|
||||
|
||||
static char *amimouse_name = "Amiga mouse";
|
||||
static char *amimouse_phys = "amimouse/input0";
|
||||
|
||||
static irqreturn_t amimouse_interrupt(int irq, void *dummy, struct pt_regs *fp)
|
||||
{
|
||||
unsigned short joy0dat, potgor;
|
||||
int nx, ny, dx, dy;
|
||||
|
||||
joy0dat = custom.joy0dat;
|
||||
|
||||
nx = joy0dat & 0xff;
|
||||
ny = joy0dat >> 8;
|
||||
|
||||
dx = nx - amimouse_lastx;
|
||||
dy = ny - amimouse_lasty;
|
||||
|
||||
if (dx < -127) dx = (256 + nx) - amimouse_lastx;
|
||||
if (dx > 127) dx = (nx - 256) - amimouse_lastx;
|
||||
if (dy < -127) dy = (256 + ny) - amimouse_lasty;
|
||||
if (dy > 127) dy = (ny - 256) - amimouse_lasty;
|
||||
|
||||
amimouse_lastx = nx;
|
||||
amimouse_lasty = ny;
|
||||
|
||||
potgor = custom.potgor;
|
||||
|
||||
input_regs(&amimouse_dev, fp);
|
||||
|
||||
input_report_rel(&amimouse_dev, REL_X, dx);
|
||||
input_report_rel(&amimouse_dev, REL_Y, dy);
|
||||
|
||||
input_report_key(&amimouse_dev, BTN_LEFT, ciaa.pra & 0x40);
|
||||
input_report_key(&amimouse_dev, BTN_MIDDLE, potgor & 0x0100);
|
||||
input_report_key(&amimouse_dev, BTN_RIGHT, potgor & 0x0400);
|
||||
|
||||
input_sync(&amimouse_dev);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int amimouse_open(struct input_dev *dev)
|
||||
{
|
||||
unsigned short joy0dat;
|
||||
|
||||
if (amimouse_used++)
|
||||
return 0;
|
||||
|
||||
joy0dat = custom.joy0dat;
|
||||
|
||||
amimouse_lastx = joy0dat & 0xff;
|
||||
amimouse_lasty = joy0dat >> 8;
|
||||
|
||||
if (request_irq(IRQ_AMIGA_VERTB, amimouse_interrupt, 0, "amimouse", amimouse_interrupt)) {
|
||||
amimouse_used--;
|
||||
printk(KERN_ERR "amimouse.c: Can't allocate irq %d\n", IRQ_AMIGA_VERTB);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void amimouse_close(struct input_dev *dev)
|
||||
{
|
||||
if (!--amimouse_used)
|
||||
free_irq(IRQ_AMIGA_VERTB, amimouse_interrupt);
|
||||
}
|
||||
|
||||
static int __init amimouse_init(void)
|
||||
{
|
||||
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE))
|
||||
return -ENODEV;
|
||||
|
||||
amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
|
||||
amimouse_dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
|
||||
amimouse_dev.open = amimouse_open;
|
||||
amimouse_dev.close = amimouse_close;
|
||||
|
||||
amimouse_dev.name = amimouse_name;
|
||||
amimouse_dev.phys = amimouse_phys;
|
||||
amimouse_dev.id.bustype = BUS_AMIGA;
|
||||
amimouse_dev.id.vendor = 0x0001;
|
||||
amimouse_dev.id.product = 0x0002;
|
||||
amimouse_dev.id.version = 0x0100;
|
||||
|
||||
input_register_device(&amimouse_dev);
|
||||
|
||||
printk(KERN_INFO "input: %s at joy0dat\n", amimouse_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit amimouse_exit(void)
|
||||
{
|
||||
input_unregister_device(&amimouse_dev);
|
||||
}
|
||||
|
||||
module_init(amimouse_init);
|
||||
module_exit(amimouse_exit);
|
||||
BIN
extra/linux-2.6.10/drivers/input/mouse/built-in.o
Normal file
BIN
extra/linux-2.6.10/drivers/input/mouse/built-in.o
Normal file
Binary file not shown.
196
extra/linux-2.6.10/drivers/input/mouse/inport.c
Normal file
196
extra/linux-2.6.10/drivers/input/mouse/inport.c
Normal file
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* $Id: inport.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $
|
||||
*
|
||||
* Copyright (c) 1999-2001 Vojtech Pavlik
|
||||
*
|
||||
* Based on the work of:
|
||||
* Teemu Rantanen Derrick Cole
|
||||
* Peter Cervasio Christoph Niemann
|
||||
* Philip Blundell Russell King
|
||||
* Bob Harris
|
||||
*/
|
||||
|
||||
/*
|
||||
* Inport (ATI XL and Microsoft) busmouse driver for Linux
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Should you need to contact me, the author, you can do so either by
|
||||
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
|
||||
* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("Inport (ATI XL and Microsoft) busmouse driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define INPORT_BASE 0x23c
|
||||
#define INPORT_EXTENT 4
|
||||
|
||||
#define INPORT_CONTROL_PORT INPORT_BASE + 0
|
||||
#define INPORT_DATA_PORT INPORT_BASE + 1
|
||||
#define INPORT_SIGNATURE_PORT INPORT_BASE + 2
|
||||
|
||||
#define INPORT_REG_BTNS 0x00
|
||||
#define INPORT_REG_X 0x01
|
||||
#define INPORT_REG_Y 0x02
|
||||
#define INPORT_REG_MODE 0x07
|
||||
#define INPORT_RESET 0x80
|
||||
|
||||
#ifdef CONFIG_INPUT_ATIXL
|
||||
#define INPORT_NAME "ATI XL Mouse"
|
||||
#define INPORT_VENDOR 0x0002
|
||||
#define INPORT_SPEED_30HZ 0x01
|
||||
#define INPORT_SPEED_50HZ 0x02
|
||||
#define INPORT_SPEED_100HZ 0x03
|
||||
#define INPORT_SPEED_200HZ 0x04
|
||||
#define INPORT_MODE_BASE INPORT_SPEED_100HZ
|
||||
#define INPORT_MODE_IRQ 0x08
|
||||
#else
|
||||
#define INPORT_NAME "Microsoft InPort Mouse"
|
||||
#define INPORT_VENDOR 0x0001
|
||||
#define INPORT_MODE_BASE 0x10
|
||||
#define INPORT_MODE_IRQ 0x01
|
||||
#endif
|
||||
#define INPORT_MODE_HOLD 0x20
|
||||
|
||||
#define INPORT_IRQ 5
|
||||
|
||||
static int inport_irq = INPORT_IRQ;
|
||||
module_param_named(irq, inport_irq, uint, 0);
|
||||
MODULE_PARM_DESC(irq, "IRQ number (5=default)");
|
||||
|
||||
__obsolete_setup("inport_irq=");
|
||||
|
||||
static int inport_used;
|
||||
|
||||
static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs);
|
||||
|
||||
static int inport_open(struct input_dev *dev)
|
||||
{
|
||||
if (!inport_used++) {
|
||||
if (request_irq(inport_irq, inport_interrupt, 0, "inport", NULL))
|
||||
return -EBUSY;
|
||||
outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);
|
||||
outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void inport_close(struct input_dev *dev)
|
||||
{
|
||||
if (!--inport_used) {
|
||||
outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);
|
||||
outb(INPORT_MODE_BASE, INPORT_DATA_PORT);
|
||||
free_irq(inport_irq, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static struct input_dev inport_dev = {
|
||||
.evbit = { BIT(EV_KEY) | BIT(EV_REL) },
|
||||
.keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },
|
||||
.relbit = { BIT(REL_X) | BIT(REL_Y) },
|
||||
.open = inport_open,
|
||||
.close = inport_close,
|
||||
.name = INPORT_NAME,
|
||||
.phys = "isa023c/input0",
|
||||
.id = {
|
||||
.bustype = BUS_ISA,
|
||||
.vendor = INPORT_VENDOR,
|
||||
.product = 0x0001,
|
||||
.version = 0x0100,
|
||||
},
|
||||
};
|
||||
|
||||
static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
unsigned char buttons;
|
||||
|
||||
outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);
|
||||
outb(INPORT_MODE_HOLD | INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);
|
||||
|
||||
input_regs(&inport_dev, regs);
|
||||
|
||||
outb(INPORT_REG_X, INPORT_CONTROL_PORT);
|
||||
input_report_rel(&inport_dev, REL_X, inb(INPORT_DATA_PORT));
|
||||
|
||||
outb(INPORT_REG_Y, INPORT_CONTROL_PORT);
|
||||
input_report_rel(&inport_dev, REL_Y, inb(INPORT_DATA_PORT));
|
||||
|
||||
outb(INPORT_REG_BTNS, INPORT_CONTROL_PORT);
|
||||
buttons = inb(INPORT_DATA_PORT);
|
||||
|
||||
input_report_key(&inport_dev, BTN_MIDDLE, buttons & 1);
|
||||
input_report_key(&inport_dev, BTN_LEFT, buttons & 2);
|
||||
input_report_key(&inport_dev, BTN_RIGHT, buttons & 4);
|
||||
|
||||
outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);
|
||||
outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);
|
||||
|
||||
input_sync(&inport_dev);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __init inport_init(void)
|
||||
{
|
||||
unsigned char a,b,c;
|
||||
|
||||
if (!request_region(INPORT_BASE, INPORT_EXTENT, "inport")) {
|
||||
printk(KERN_ERR "inport.c: Can't allocate ports at %#x\n", INPORT_BASE);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
a = inb(INPORT_SIGNATURE_PORT);
|
||||
b = inb(INPORT_SIGNATURE_PORT);
|
||||
c = inb(INPORT_SIGNATURE_PORT);
|
||||
if (( a == b ) || ( a != c )) {
|
||||
release_region(INPORT_BASE, INPORT_EXTENT);
|
||||
printk(KERN_ERR "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
outb(INPORT_RESET, INPORT_CONTROL_PORT);
|
||||
outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);
|
||||
outb(INPORT_MODE_BASE, INPORT_DATA_PORT);
|
||||
|
||||
input_register_device(&inport_dev);
|
||||
|
||||
printk(KERN_INFO "input: " INPORT_NAME " at %#x irq %d\n", INPORT_BASE, inport_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit inport_exit(void)
|
||||
{
|
||||
input_unregister_device(&inport_dev);
|
||||
release_region(INPORT_BASE, INPORT_EXTENT);
|
||||
}
|
||||
|
||||
module_init(inport_init);
|
||||
module_exit(inport_exit);
|
||||
183
extra/linux-2.6.10/drivers/input/mouse/logibm.c
Normal file
183
extra/linux-2.6.10/drivers/input/mouse/logibm.c
Normal file
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
* $Id: logibm.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $
|
||||
*
|
||||
* Copyright (c) 1999-2001 Vojtech Pavlik
|
||||
*
|
||||
* Based on the work of:
|
||||
* James Banks Matthew Dillon
|
||||
* David Giller Nathan Laredo
|
||||
* Linus Torvalds Johan Myreen
|
||||
* Cliff Matthews Philip Blundell
|
||||
* Russell King
|
||||
*/
|
||||
|
||||
/*
|
||||
* Logitech Bus Mouse Driver for Linux
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Should you need to contact me, the author, you can do so either by
|
||||
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
|
||||
* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("Logitech busmouse driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define LOGIBM_BASE 0x23c
|
||||
#define LOGIBM_EXTENT 4
|
||||
|
||||
#define LOGIBM_DATA_PORT LOGIBM_BASE + 0
|
||||
#define LOGIBM_SIGNATURE_PORT LOGIBM_BASE + 1
|
||||
#define LOGIBM_CONTROL_PORT LOGIBM_BASE + 2
|
||||
#define LOGIBM_CONFIG_PORT LOGIBM_BASE + 3
|
||||
|
||||
#define LOGIBM_ENABLE_IRQ 0x00
|
||||
#define LOGIBM_DISABLE_IRQ 0x10
|
||||
#define LOGIBM_READ_X_LOW 0x80
|
||||
#define LOGIBM_READ_X_HIGH 0xa0
|
||||
#define LOGIBM_READ_Y_LOW 0xc0
|
||||
#define LOGIBM_READ_Y_HIGH 0xe0
|
||||
|
||||
#define LOGIBM_DEFAULT_MODE 0x90
|
||||
#define LOGIBM_CONFIG_BYTE 0x91
|
||||
#define LOGIBM_SIGNATURE_BYTE 0xa5
|
||||
|
||||
#define LOGIBM_IRQ 5
|
||||
|
||||
static int logibm_irq = LOGIBM_IRQ;
|
||||
module_param_named(irq, logibm_irq, uint, 0);
|
||||
MODULE_PARM_DESC(irq, "IRQ number (5=default)");
|
||||
|
||||
__obsolete_setup("logibm_irq=");
|
||||
|
||||
static int logibm_used = 0;
|
||||
|
||||
static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs);
|
||||
|
||||
static int logibm_open(struct input_dev *dev)
|
||||
{
|
||||
if (logibm_used++)
|
||||
return 0;
|
||||
if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) {
|
||||
logibm_used--;
|
||||
printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq);
|
||||
return -EBUSY;
|
||||
}
|
||||
outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void logibm_close(struct input_dev *dev)
|
||||
{
|
||||
if (--logibm_used)
|
||||
return;
|
||||
outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT);
|
||||
free_irq(logibm_irq, NULL);
|
||||
}
|
||||
|
||||
static struct input_dev logibm_dev = {
|
||||
.evbit = { BIT(EV_KEY) | BIT(EV_REL) },
|
||||
.keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },
|
||||
.relbit = { BIT(REL_X) | BIT(REL_Y) },
|
||||
.open = logibm_open,
|
||||
.close = logibm_close,
|
||||
.name = "Logitech bus mouse",
|
||||
.phys = "isa023c/input0",
|
||||
.id = {
|
||||
.bustype = BUS_ISA,
|
||||
.vendor = 0x0003,
|
||||
.product = 0x0001,
|
||||
.version = 0x0100,
|
||||
},
|
||||
};
|
||||
|
||||
static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
char dx, dy;
|
||||
unsigned char buttons;
|
||||
|
||||
outb(LOGIBM_READ_X_LOW, LOGIBM_CONTROL_PORT);
|
||||
dx = (inb(LOGIBM_DATA_PORT) & 0xf);
|
||||
outb(LOGIBM_READ_X_HIGH, LOGIBM_CONTROL_PORT);
|
||||
dx |= (inb(LOGIBM_DATA_PORT) & 0xf) << 4;
|
||||
outb(LOGIBM_READ_Y_LOW, LOGIBM_CONTROL_PORT);
|
||||
dy = (inb(LOGIBM_DATA_PORT) & 0xf);
|
||||
outb(LOGIBM_READ_Y_HIGH, LOGIBM_CONTROL_PORT);
|
||||
buttons = inb(LOGIBM_DATA_PORT);
|
||||
dy |= (buttons & 0xf) << 4;
|
||||
buttons = ~buttons >> 5;
|
||||
|
||||
input_regs(&logibm_dev, regs);
|
||||
input_report_rel(&logibm_dev, REL_X, dx);
|
||||
input_report_rel(&logibm_dev, REL_Y, dy);
|
||||
input_report_key(&logibm_dev, BTN_RIGHT, buttons & 1);
|
||||
input_report_key(&logibm_dev, BTN_MIDDLE, buttons & 2);
|
||||
input_report_key(&logibm_dev, BTN_LEFT, buttons & 4);
|
||||
input_sync(&logibm_dev);
|
||||
|
||||
outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __init logibm_init(void)
|
||||
{
|
||||
if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) {
|
||||
printk(KERN_ERR "logibm.c: Can't allocate ports at %#x\n", LOGIBM_BASE);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
outb(LOGIBM_CONFIG_BYTE, LOGIBM_CONFIG_PORT);
|
||||
outb(LOGIBM_SIGNATURE_BYTE, LOGIBM_SIGNATURE_PORT);
|
||||
udelay(100);
|
||||
|
||||
if (inb(LOGIBM_SIGNATURE_PORT) != LOGIBM_SIGNATURE_BYTE) {
|
||||
release_region(LOGIBM_BASE, LOGIBM_EXTENT);
|
||||
printk(KERN_ERR "logibm.c: Didn't find Logitech busmouse at %#x\n", LOGIBM_BASE);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT);
|
||||
outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT);
|
||||
|
||||
input_register_device(&logibm_dev);
|
||||
|
||||
printk(KERN_INFO "input: Logitech bus mouse at %#x irq %d\n", LOGIBM_BASE, logibm_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit logibm_exit(void)
|
||||
{
|
||||
input_unregister_device(&logibm_dev);
|
||||
release_region(LOGIBM_BASE, LOGIBM_EXTENT);
|
||||
}
|
||||
|
||||
module_init(logibm_init);
|
||||
module_exit(logibm_exit);
|
||||
310
extra/linux-2.6.10/drivers/input/mouse/logips2pp.c
Normal file
310
extra/linux-2.6.10/drivers/input/mouse/logips2pp.c
Normal file
@@ -0,0 +1,310 @@
|
||||
/*
|
||||
* Logitech PS/2++ mouse driver
|
||||
*
|
||||
* Copyright (c) 1999-2003 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2003 Eric Wong <eric@yhbt.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/serio.h>
|
||||
#include "psmouse.h"
|
||||
#include "logips2pp.h"
|
||||
|
||||
/* Logitech mouse types */
|
||||
#define PS2PP_KIND_WHEEL 1
|
||||
#define PS2PP_KIND_MX 2
|
||||
#define PS2PP_KIND_TP3 3
|
||||
|
||||
/* Logitech mouse features */
|
||||
#define PS2PP_WHEEL 0x01
|
||||
#define PS2PP_HWHEEL 0x02
|
||||
#define PS2PP_SIDE_BTN 0x04
|
||||
#define PS2PP_EXTRA_BTN 0x08
|
||||
#define PS2PP_TASK_BTN 0x10
|
||||
#define PS2PP_NAV_BTN 0x20
|
||||
|
||||
struct ps2pp_info {
|
||||
const int model;
|
||||
unsigned const int kind;
|
||||
unsigned const int features;
|
||||
};
|
||||
|
||||
/*
|
||||
* Process a PS2++ or PS2T++ packet.
|
||||
*/
|
||||
|
||||
void ps2pp_process_packet(struct psmouse *psmouse)
|
||||
{
|
||||
struct input_dev *dev = &psmouse->dev;
|
||||
unsigned char *packet = psmouse->packet;
|
||||
|
||||
if ((packet[0] & 0x48) == 0x48 && (packet[1] & 0x02) == 0x02) {
|
||||
|
||||
switch ((packet[1] >> 4) | (packet[0] & 0x30)) {
|
||||
|
||||
case 0x0d: /* Mouse extra info */
|
||||
|
||||
input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL,
|
||||
(int) (packet[2] & 8) - (int) (packet[2] & 7));
|
||||
input_report_key(dev, BTN_SIDE, (packet[2] >> 4) & 1);
|
||||
input_report_key(dev, BTN_EXTRA, (packet[2] >> 5) & 1);
|
||||
|
||||
break;
|
||||
|
||||
case 0x0e: /* buttons 4, 5, 6, 7, 8, 9, 10 info */
|
||||
|
||||
input_report_key(dev, BTN_SIDE, (packet[2]) & 1);
|
||||
input_report_key(dev, BTN_EXTRA, (packet[2] >> 1) & 1);
|
||||
input_report_key(dev, BTN_BACK, (packet[2] >> 3) & 1);
|
||||
input_report_key(dev, BTN_FORWARD, (packet[2] >> 4) & 1);
|
||||
input_report_key(dev, BTN_TASK, (packet[2] >> 2) & 1);
|
||||
|
||||
break;
|
||||
|
||||
case 0x0f: /* TouchPad extra info */
|
||||
|
||||
input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL,
|
||||
(int) ((packet[2] >> 4) & 8) - (int) ((packet[2] >> 4) & 7));
|
||||
packet[0] = packet[2] | 0x08;
|
||||
break;
|
||||
|
||||
#ifdef DEBUG
|
||||
default:
|
||||
printk(KERN_WARNING "psmouse.c: Received PS2++ packet #%x, but don't know how to handle.\n",
|
||||
(packet[1] >> 4) | (packet[0] & 0x30));
|
||||
#endif
|
||||
}
|
||||
|
||||
packet[0] &= 0x0f;
|
||||
packet[1] = 0;
|
||||
packet[2] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ps2pp_cmd() sends a PS2++ command, sliced into two bit
|
||||
* pieces through the SETRES command. This is needed to send extended
|
||||
* commands to mice on notebooks that try to understand the PS/2 protocol
|
||||
* Ugly.
|
||||
*/
|
||||
|
||||
static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned char command)
|
||||
{
|
||||
if (psmouse_sliced_command(psmouse, command))
|
||||
return -1;
|
||||
|
||||
if (psmouse_command(psmouse, param, PSMOUSE_CMD_POLL))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* SmartScroll / CruiseControl for some newer Logitech mice Defaults to
|
||||
* enabled if we do nothing to it. Of course I put this in because I want it
|
||||
* disabled :P
|
||||
* 1 - enabled (if previously disabled, also default)
|
||||
* 0/2 - disabled
|
||||
*/
|
||||
|
||||
static void ps2pp_set_smartscroll(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[4];
|
||||
|
||||
ps2pp_cmd(psmouse, param, 0x32);
|
||||
|
||||
param[0] = 0;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
|
||||
if (psmouse_smartscroll < 2) {
|
||||
/* 0 - disabled, 1 - enabled */
|
||||
param[0] = psmouse_smartscroll;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Support 800 dpi resolution _only_ if the user wants it (there are good
|
||||
* reasons to not use it even if the mouse supports it, and of course there are
|
||||
* also good reasons to use it, let the user decide).
|
||||
*/
|
||||
|
||||
void ps2pp_set_800dpi(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param = 3;
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, ¶m, PSMOUSE_CMD_SETRES);
|
||||
}
|
||||
|
||||
static struct ps2pp_info *get_model_info(unsigned char model)
|
||||
{
|
||||
static struct ps2pp_info ps2pp_list[] = {
|
||||
{ 12, 0, PS2PP_SIDE_BTN},
|
||||
{ 13, 0, 0 },
|
||||
{ 40, 0, PS2PP_SIDE_BTN },
|
||||
{ 41, 0, PS2PP_SIDE_BTN },
|
||||
{ 42, 0, PS2PP_SIDE_BTN },
|
||||
{ 43, 0, PS2PP_SIDE_BTN },
|
||||
{ 50, 0, 0 },
|
||||
{ 51, 0, 0 },
|
||||
{ 52, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL },
|
||||
{ 53, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 61, PS2PP_KIND_MX,
|
||||
PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |
|
||||
PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, /* MX700 */
|
||||
{ 73, 0, PS2PP_SIDE_BTN },
|
||||
{ 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 80, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL },
|
||||
{ 81, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 83, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 88, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 96, 0, 0 },
|
||||
{ 97, PS2PP_KIND_TP3, PS2PP_WHEEL | PS2PP_HWHEEL },
|
||||
{ 100, PS2PP_KIND_MX,
|
||||
PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |
|
||||
PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, /* MX510 */
|
||||
{ 112, PS2PP_KIND_MX,
|
||||
PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |
|
||||
PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, /* MX500 */
|
||||
{ 114, PS2PP_KIND_MX,
|
||||
PS2PP_WHEEL | PS2PP_SIDE_BTN |
|
||||
PS2PP_TASK_BTN | PS2PP_EXTRA_BTN }, /* M310 */
|
||||
{ }
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i = 0; ps2pp_list[i].model; i++)
|
||||
if (model == ps2pp_list[i].model)
|
||||
return &ps2pp_list[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up input device's properties based on the detected mouse model.
|
||||
*/
|
||||
|
||||
static void ps2pp_set_model_properties(struct psmouse *psmouse, struct ps2pp_info *model_info)
|
||||
{
|
||||
if (model_info->features & PS2PP_SIDE_BTN)
|
||||
set_bit(BTN_SIDE, psmouse->dev.keybit);
|
||||
|
||||
if (model_info->features & PS2PP_EXTRA_BTN)
|
||||
set_bit(BTN_EXTRA, psmouse->dev.keybit);
|
||||
|
||||
if (model_info->features & PS2PP_TASK_BTN)
|
||||
set_bit(BTN_TASK, psmouse->dev.keybit);
|
||||
|
||||
if (model_info->features & PS2PP_NAV_BTN) {
|
||||
set_bit(BTN_FORWARD, psmouse->dev.keybit);
|
||||
set_bit(BTN_BACK, psmouse->dev.keybit);
|
||||
}
|
||||
|
||||
if (model_info->features & PS2PP_WHEEL)
|
||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||
|
||||
if (model_info->features & PS2PP_HWHEEL)
|
||||
set_bit(REL_HWHEEL, psmouse->dev.relbit);
|
||||
|
||||
switch (model_info->kind) {
|
||||
case PS2PP_KIND_WHEEL:
|
||||
psmouse->name = "Wheel Mouse";
|
||||
break;
|
||||
|
||||
case PS2PP_KIND_MX:
|
||||
psmouse->name = "MX Mouse";
|
||||
break;
|
||||
|
||||
case PS2PP_KIND_TP3:
|
||||
psmouse->name = "TouchPad 3";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Logitech magic init. Detect whether the mouse is a Logitech one
|
||||
* and its exact model and try turning on extended protocol for ones
|
||||
* that support it.
|
||||
*/
|
||||
|
||||
int ps2pp_init(struct psmouse *psmouse, int set_properties)
|
||||
{
|
||||
unsigned char param[4];
|
||||
unsigned char protocol = PSMOUSE_PS2;
|
||||
unsigned char model, buttons;
|
||||
struct ps2pp_info *model_info;
|
||||
|
||||
param[0] = 0;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
param[1] = 0;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
|
||||
|
||||
if (param[1] != 0) {
|
||||
model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78);
|
||||
buttons = param[1];
|
||||
model_info = get_model_info(model);
|
||||
|
||||
/*
|
||||
* Do Logitech PS2++ / PS2T++ magic init.
|
||||
*/
|
||||
if (model == 97) { /* Touch Pad 3 */
|
||||
|
||||
/* Unprotect RAM */
|
||||
param[0] = 0x11; param[1] = 0x04; param[2] = 0x68;
|
||||
psmouse_command(psmouse, param, 0x30d1);
|
||||
/* Enable features */
|
||||
param[0] = 0x11; param[1] = 0x05; param[2] = 0x0b;
|
||||
psmouse_command(psmouse, param, 0x30d1);
|
||||
/* Enable PS2++ */
|
||||
param[0] = 0x11; param[1] = 0x09; param[2] = 0xc3;
|
||||
psmouse_command(psmouse, param, 0x30d1);
|
||||
|
||||
param[0] = 0;
|
||||
if (!psmouse_command(psmouse, param, 0x13d1) &&
|
||||
param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) {
|
||||
protocol = PSMOUSE_PS2TPP;
|
||||
}
|
||||
|
||||
} else if (model_info != NULL) {
|
||||
|
||||
param[0] = param[1] = param[2] = 0;
|
||||
ps2pp_cmd(psmouse, param, 0x39); /* Magic knock */
|
||||
ps2pp_cmd(psmouse, param, 0xDB);
|
||||
|
||||
if ((param[0] & 0x78) == 0x48 &&
|
||||
(param[1] & 0xf3) == 0xc2 &&
|
||||
(param[2] & 0x03) == ((param[1] >> 2) & 3)) {
|
||||
ps2pp_set_smartscroll(psmouse);
|
||||
protocol = PSMOUSE_PS2PP;
|
||||
}
|
||||
}
|
||||
|
||||
if (set_properties) {
|
||||
psmouse->vendor = "Logitech";
|
||||
psmouse->model = model;
|
||||
|
||||
if (buttons < 3)
|
||||
clear_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||
if (buttons < 2)
|
||||
clear_bit(BTN_RIGHT, psmouse->dev.keybit);
|
||||
|
||||
if (model_info)
|
||||
ps2pp_set_model_properties(psmouse, model_info);
|
||||
}
|
||||
}
|
||||
|
||||
return protocol;
|
||||
}
|
||||
|
||||
18
extra/linux-2.6.10/drivers/input/mouse/logips2pp.h
Normal file
18
extra/linux-2.6.10/drivers/input/mouse/logips2pp.h
Normal file
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Logitech PS/2++ mouse driver header
|
||||
*
|
||||
* Copyright (c) 2003 Vojtech Pavlik <vojtech@suse.cz>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _LOGIPS2PP_H
|
||||
#define _LOGIPS2PP_H
|
||||
|
||||
void ps2pp_process_packet(struct psmouse *psmouse);
|
||||
void ps2pp_set_800dpi(struct psmouse *psmouse);
|
||||
int ps2pp_init(struct psmouse *psmouse, int set_properties);
|
||||
|
||||
#endif
|
||||
BIN
extra/linux-2.6.10/drivers/input/mouse/logips2pp.o
Normal file
BIN
extra/linux-2.6.10/drivers/input/mouse/logips2pp.o
Normal file
Binary file not shown.
134
extra/linux-2.6.10/drivers/input/mouse/maplemouse.c
Normal file
134
extra/linux-2.6.10/drivers/input/mouse/maplemouse.c
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* $Id: maplemouse.c,v 1.2 2004/03/22 01:18:15 lethal Exp $
|
||||
* SEGA Dreamcast mouse driver
|
||||
* Based on drivers/usb/usbmouse.c
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/maple.h>
|
||||
|
||||
MODULE_AUTHOR("YAEGASHI Takeshi <t@keshi.org>");
|
||||
MODULE_DESCRIPTION("SEGA Dreamcast mouse driver");
|
||||
|
||||
struct dc_mouse {
|
||||
struct input_dev dev;
|
||||
int open;
|
||||
};
|
||||
|
||||
|
||||
static void dc_mouse_callback(struct mapleq *mq)
|
||||
{
|
||||
int buttons, relx, rely, relz;
|
||||
struct maple_device *mapledev = mq->dev;
|
||||
struct dc_mouse *mouse = mapledev->private_data;
|
||||
struct input_dev *dev = &mouse->dev;
|
||||
unsigned char *res = mq->recvbuf;
|
||||
|
||||
buttons = ~res[8];
|
||||
relx=*(unsigned short *)(res+12)-512;
|
||||
rely=*(unsigned short *)(res+14)-512;
|
||||
relz=*(unsigned short *)(res+16)-512;
|
||||
|
||||
input_report_key(dev, BTN_LEFT, buttons&4);
|
||||
input_report_key(dev, BTN_MIDDLE, buttons&9);
|
||||
input_report_key(dev, BTN_RIGHT, buttons&2);
|
||||
input_report_rel(dev, REL_X, relx);
|
||||
input_report_rel(dev, REL_Y, rely);
|
||||
input_report_rel(dev, REL_WHEEL, relz);
|
||||
input_sync(dev);
|
||||
}
|
||||
|
||||
|
||||
static int dc_mouse_open(struct input_dev *dev)
|
||||
{
|
||||
struct dc_mouse *mouse = dev->private;
|
||||
mouse->open++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void dc_mouse_close(struct input_dev *dev)
|
||||
{
|
||||
struct dc_mouse *mouse = dev->private;
|
||||
mouse->open--;
|
||||
}
|
||||
|
||||
|
||||
static int dc_mouse_connect(struct maple_device *dev)
|
||||
{
|
||||
unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]);
|
||||
struct dc_mouse *mouse;
|
||||
|
||||
if (!(mouse = kmalloc(sizeof(struct dc_mouse), GFP_KERNEL)))
|
||||
return -1;
|
||||
memset(mouse, 0, sizeof(struct dc_mouse));
|
||||
|
||||
dev->private_data = mouse;
|
||||
|
||||
mouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
mouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
mouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL);
|
||||
|
||||
init_input_dev(&mouse->dev);
|
||||
|
||||
mouse->dev.private = mouse;
|
||||
mouse->dev.open = dc_mouse_open;
|
||||
mouse->dev.close = dc_mouse_close;
|
||||
mouse->dev.event = NULL;
|
||||
|
||||
mouse->dev.name = dev->product_name;
|
||||
mouse->dev.id.bustype = BUS_MAPLE;
|
||||
|
||||
input_register_device(&mouse->dev);
|
||||
|
||||
maple_getcond_callback(dev, dc_mouse_callback, 1, MAPLE_FUNC_MOUSE);
|
||||
|
||||
printk(KERN_INFO "input: mouse(0x%lx): %s\n", data, mouse->dev.name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void dc_mouse_disconnect(struct maple_device *dev)
|
||||
{
|
||||
struct dc_mouse *mouse = dev->private_data;
|
||||
|
||||
input_unregister_device(&mouse->dev);
|
||||
kfree(mouse);
|
||||
}
|
||||
|
||||
|
||||
static struct maple_driver dc_mouse_driver = {
|
||||
.function = MAPLE_FUNC_MOUSE,
|
||||
.name = "Dreamcast mouse",
|
||||
.connect = dc_mouse_connect,
|
||||
.disconnect = dc_mouse_disconnect,
|
||||
};
|
||||
|
||||
|
||||
static int __init dc_mouse_init(void)
|
||||
{
|
||||
maple_register_driver(&dc_mouse_driver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void __exit dc_mouse_exit(void)
|
||||
{
|
||||
maple_unregister_driver(&dc_mouse_driver);
|
||||
}
|
||||
|
||||
|
||||
module_init(dc_mouse_init);
|
||||
module_exit(dc_mouse_exit);
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* End:
|
||||
*/
|
||||
178
extra/linux-2.6.10/drivers/input/mouse/pc110pad.c
Normal file
178
extra/linux-2.6.10/drivers/input/mouse/pc110pad.c
Normal file
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
* $Id: pc110pad.c,v 1.12 2001/09/25 10:12:07 vojtech Exp $
|
||||
*
|
||||
* Copyright (c) 2000-2001 Vojtech Pavlik
|
||||
*
|
||||
* Based on the work of:
|
||||
* Alan Cox Robin O'Leary
|
||||
*/
|
||||
|
||||
/*
|
||||
* IBM PC110 touchpad driver for Linux
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Should you need to contact me, the author, you can do so either by
|
||||
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
|
||||
* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("IBM PC110 touchpad driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define PC110PAD_OFF 0x30
|
||||
#define PC110PAD_ON 0x38
|
||||
|
||||
static int pc110pad_irq = 10;
|
||||
static int pc110pad_io = 0x15e0;
|
||||
|
||||
static struct input_dev pc110pad_dev;
|
||||
static int pc110pad_data[3];
|
||||
static int pc110pad_count;
|
||||
static int pc110pad_used;
|
||||
|
||||
static char *pc110pad_name = "IBM PC110 TouchPad";
|
||||
static char *pc110pad_phys = "isa15e0/input0";
|
||||
|
||||
static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs)
|
||||
{
|
||||
int value = inb_p(pc110pad_io);
|
||||
int handshake = inb_p(pc110pad_io + 2);
|
||||
|
||||
outb_p(handshake | 1, pc110pad_io + 2);
|
||||
outb_p(handshake & ~1, pc110pad_io + 2);
|
||||
inb_p(0x64);
|
||||
|
||||
pc110pad_data[pc110pad_count++] = value;
|
||||
|
||||
if (pc110pad_count < 3)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
input_regs(&pc110pad_dev, regs);
|
||||
input_report_key(&pc110pad_dev, BTN_TOUCH,
|
||||
pc110pad_data[0] & 0x01);
|
||||
input_report_abs(&pc110pad_dev, ABS_X,
|
||||
pc110pad_data[1] | ((pc110pad_data[0] << 3) & 0x80) | ((pc110pad_data[0] << 1) & 0x100));
|
||||
input_report_abs(&pc110pad_dev, ABS_Y,
|
||||
pc110pad_data[2] | ((pc110pad_data[0] << 4) & 0x80));
|
||||
input_sync(&pc110pad_dev);
|
||||
|
||||
pc110pad_count = 0;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void pc110pad_close(struct input_dev *dev)
|
||||
{
|
||||
if (!--pc110pad_used)
|
||||
outb(PC110PAD_OFF, pc110pad_io + 2);
|
||||
}
|
||||
|
||||
static int pc110pad_open(struct input_dev *dev)
|
||||
{
|
||||
if (pc110pad_used++)
|
||||
return 0;
|
||||
|
||||
pc110pad_interrupt(0,NULL,NULL);
|
||||
pc110pad_interrupt(0,NULL,NULL);
|
||||
pc110pad_interrupt(0,NULL,NULL);
|
||||
outb(PC110PAD_ON, pc110pad_io + 2);
|
||||
pc110pad_count = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We try to avoid enabling the hardware if it's not
|
||||
* there, but we don't know how to test. But we do know
|
||||
* that the PC110 is not a PCI system. So if we find any
|
||||
* PCI devices in the machine, we don't have a PC110.
|
||||
*/
|
||||
static int __init pc110pad_init(void)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
|
||||
dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL);
|
||||
if (dev) {
|
||||
pci_dev_put(dev);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
if (!request_region(pc110pad_io, 4, "pc110pad")) {
|
||||
printk(KERN_ERR "pc110pad: I/O area %#x-%#x in use.\n",
|
||||
pc110pad_io, pc110pad_io + 4);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
outb(PC110PAD_OFF, pc110pad_io + 2);
|
||||
|
||||
if (request_irq(pc110pad_irq, pc110pad_interrupt, 0, "pc110pad", NULL))
|
||||
{
|
||||
release_region(pc110pad_io, 4);
|
||||
printk(KERN_ERR "pc110pad: Unable to get irq %d.\n", pc110pad_irq);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
pc110pad_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
pc110pad_dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
|
||||
pc110pad_dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
|
||||
pc110pad_dev.absmax[ABS_X] = 0x1ff;
|
||||
pc110pad_dev.absmax[ABS_Y] = 0x0ff;
|
||||
|
||||
pc110pad_dev.open = pc110pad_open;
|
||||
pc110pad_dev.close = pc110pad_close;
|
||||
|
||||
pc110pad_dev.name = pc110pad_name;
|
||||
pc110pad_dev.phys = pc110pad_phys;
|
||||
pc110pad_dev.id.bustype = BUS_ISA;
|
||||
pc110pad_dev.id.vendor = 0x0003;
|
||||
pc110pad_dev.id.product = 0x0001;
|
||||
pc110pad_dev.id.version = 0x0100;
|
||||
|
||||
input_register_device(&pc110pad_dev);
|
||||
|
||||
printk(KERN_INFO "input: %s at %#x irq %d\n",
|
||||
pc110pad_name, pc110pad_io, pc110pad_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit pc110pad_exit(void)
|
||||
{
|
||||
input_unregister_device(&pc110pad_dev);
|
||||
|
||||
outb(PC110PAD_OFF, pc110pad_io + 2);
|
||||
|
||||
free_irq(pc110pad_irq, NULL);
|
||||
release_region(pc110pad_io, 4);
|
||||
}
|
||||
|
||||
module_init(pc110pad_init);
|
||||
module_exit(pc110pad_exit);
|
||||
916
extra/linux-2.6.10/drivers/input/mouse/psmouse-base.c
Normal file
916
extra/linux-2.6.10/drivers/input/mouse/psmouse-base.c
Normal file
@@ -0,0 +1,916 @@
|
||||
/*
|
||||
* PS/2 mouse driver
|
||||
*
|
||||
* Copyright (c) 1999-2002 Vojtech Pavlik
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/serio.h>
|
||||
#include <linux/init.h>
|
||||
#include "psmouse.h"
|
||||
#include "synaptics.h"
|
||||
#include "logips2pp.h"
|
||||
|
||||
#define DRIVER_DESC "PS/2 mouse driver"
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static char *psmouse_proto;
|
||||
static unsigned int psmouse_max_proto = -1U;
|
||||
module_param_named(proto, psmouse_proto, charp, 0);
|
||||
MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps). Useful for KVM switches.");
|
||||
|
||||
int psmouse_resolution = 200;
|
||||
module_param_named(resolution, psmouse_resolution, uint, 0);
|
||||
MODULE_PARM_DESC(resolution, "Resolution, in dpi.");
|
||||
|
||||
unsigned int psmouse_rate = 100;
|
||||
module_param_named(rate, psmouse_rate, uint, 0);
|
||||
MODULE_PARM_DESC(rate, "Report rate, in reports per second.");
|
||||
|
||||
int psmouse_smartscroll = 1;
|
||||
module_param_named(smartscroll, psmouse_smartscroll, bool, 0);
|
||||
MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
|
||||
|
||||
static unsigned int psmouse_resetafter;
|
||||
module_param_named(resetafter, psmouse_resetafter, uint, 0);
|
||||
MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
|
||||
|
||||
__obsolete_setup("psmouse_noext");
|
||||
__obsolete_setup("psmouse_resolution=");
|
||||
__obsolete_setup("psmouse_smartscroll=");
|
||||
__obsolete_setup("psmouse_resetafter=");
|
||||
__obsolete_setup("psmouse_rate=");
|
||||
|
||||
static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "PS2T++", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2"};
|
||||
|
||||
/*
|
||||
* psmouse_process_byte() analyzes the PS/2 data stream and reports
|
||||
* relevant events to the input module once full packet has arrived.
|
||||
*/
|
||||
|
||||
static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &psmouse->dev;
|
||||
unsigned char *packet = psmouse->packet;
|
||||
|
||||
if (psmouse->pktcnt < 3 + (psmouse->type >= PSMOUSE_GENPS))
|
||||
return PSMOUSE_GOOD_DATA;
|
||||
|
||||
/*
|
||||
* Full packet accumulated, process it
|
||||
*/
|
||||
|
||||
input_regs(dev, regs);
|
||||
|
||||
/*
|
||||
* The PS2++ protocol is a little bit complex
|
||||
*/
|
||||
|
||||
if (psmouse->type == PSMOUSE_PS2PP || psmouse->type == PSMOUSE_PS2TPP)
|
||||
ps2pp_process_packet(psmouse);
|
||||
|
||||
/*
|
||||
* Scroll wheel on IntelliMice, scroll buttons on NetMice
|
||||
*/
|
||||
|
||||
if (psmouse->type == PSMOUSE_IMPS || psmouse->type == PSMOUSE_GENPS)
|
||||
input_report_rel(dev, REL_WHEEL, -(signed char) packet[3]);
|
||||
|
||||
/*
|
||||
* Scroll wheel and buttons on IntelliMouse Explorer
|
||||
*/
|
||||
|
||||
if (psmouse->type == PSMOUSE_IMEX) {
|
||||
input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7));
|
||||
input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1);
|
||||
input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extra buttons on Genius NewNet 3D
|
||||
*/
|
||||
|
||||
if (psmouse->type == PSMOUSE_GENPS) {
|
||||
input_report_key(dev, BTN_SIDE, (packet[0] >> 6) & 1);
|
||||
input_report_key(dev, BTN_EXTRA, (packet[0] >> 7) & 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic PS/2 Mouse
|
||||
*/
|
||||
|
||||
input_report_key(dev, BTN_LEFT, packet[0] & 1);
|
||||
input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);
|
||||
input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1);
|
||||
|
||||
input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);
|
||||
input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);
|
||||
|
||||
input_sync(dev);
|
||||
|
||||
return PSMOUSE_FULL_PACKET;
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_interrupt() handles incoming characters, either gathering them into
|
||||
* packets or passing them to the command routine as command output.
|
||||
*/
|
||||
|
||||
static irqreturn_t psmouse_interrupt(struct serio *serio,
|
||||
unsigned char data, unsigned int flags, struct pt_regs *regs)
|
||||
{
|
||||
struct psmouse *psmouse = serio->private;
|
||||
psmouse_ret_t rc;
|
||||
|
||||
if (psmouse->state == PSMOUSE_IGNORE)
|
||||
goto out;
|
||||
|
||||
if (flags & (SERIO_PARITY|SERIO_TIMEOUT)) {
|
||||
if (psmouse->state == PSMOUSE_ACTIVATED)
|
||||
printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",
|
||||
flags & SERIO_TIMEOUT ? " timeout" : "",
|
||||
flags & SERIO_PARITY ? " bad parity" : "");
|
||||
psmouse->nak = 1;
|
||||
clear_bit(PSMOUSE_FLAG_ACK, &psmouse->flags);
|
||||
clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
|
||||
wake_up_interruptible(&psmouse->wait);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (test_bit(PSMOUSE_FLAG_ACK, &psmouse->flags)) {
|
||||
switch (data) {
|
||||
case PSMOUSE_RET_ACK:
|
||||
psmouse->nak = 0;
|
||||
break;
|
||||
|
||||
case PSMOUSE_RET_NAK:
|
||||
psmouse->nak = 1;
|
||||
break;
|
||||
|
||||
/*
|
||||
* Workaround for mice which don't ACK the Get ID command.
|
||||
* These are valid mouse IDs that we recognize.
|
||||
*/
|
||||
case 0x00:
|
||||
case 0x03:
|
||||
case 0x04:
|
||||
if (test_bit(PSMOUSE_FLAG_WAITID, &psmouse->flags)) {
|
||||
psmouse->nak = 0;
|
||||
break;
|
||||
}
|
||||
/* Fall through */
|
||||
default:
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!psmouse->nak && psmouse->cmdcnt) {
|
||||
set_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
|
||||
set_bit(PSMOUSE_FLAG_CMD1, &psmouse->flags);
|
||||
}
|
||||
clear_bit(PSMOUSE_FLAG_ACK, &psmouse->flags);
|
||||
wake_up_interruptible(&psmouse->wait);
|
||||
|
||||
if (data == PSMOUSE_RET_ACK || data == PSMOUSE_RET_NAK)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (test_bit(PSMOUSE_FLAG_CMD, &psmouse->flags)) {
|
||||
if (psmouse->cmdcnt)
|
||||
psmouse->cmdbuf[--psmouse->cmdcnt] = data;
|
||||
|
||||
if (test_and_clear_bit(PSMOUSE_FLAG_CMD1, &psmouse->flags) && psmouse->cmdcnt)
|
||||
wake_up_interruptible(&psmouse->wait);
|
||||
|
||||
if (!psmouse->cmdcnt) {
|
||||
clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
|
||||
wake_up_interruptible(&psmouse->wait);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (psmouse->state == PSMOUSE_INITIALIZING)
|
||||
goto out;
|
||||
|
||||
if (psmouse->state == PSMOUSE_ACTIVATED &&
|
||||
psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
|
||||
printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
|
||||
psmouse->name, psmouse->phys, psmouse->pktcnt);
|
||||
psmouse->pktcnt = 0;
|
||||
}
|
||||
|
||||
psmouse->last = jiffies;
|
||||
psmouse->packet[psmouse->pktcnt++] = data;
|
||||
|
||||
if (psmouse->packet[0] == PSMOUSE_RET_BAT) {
|
||||
if (psmouse->pktcnt == 1)
|
||||
goto out;
|
||||
|
||||
if (psmouse->pktcnt == 2) {
|
||||
if (psmouse->packet[1] == PSMOUSE_RET_ID) {
|
||||
psmouse->state = PSMOUSE_IGNORE;
|
||||
serio_reconnect(serio);
|
||||
goto out;
|
||||
}
|
||||
if (psmouse->type == PSMOUSE_SYNAPTICS) {
|
||||
/* neither 0xAA nor 0x00 are valid first bytes
|
||||
* for a packet in absolute mode
|
||||
*/
|
||||
psmouse->pktcnt = 0;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rc = psmouse->protocol_handler(psmouse, regs);
|
||||
|
||||
switch (rc) {
|
||||
case PSMOUSE_BAD_DATA:
|
||||
printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n",
|
||||
psmouse->name, psmouse->phys, psmouse->pktcnt);
|
||||
psmouse->pktcnt = 0;
|
||||
|
||||
if (++psmouse->out_of_sync == psmouse_resetafter) {
|
||||
psmouse->state = PSMOUSE_IGNORE;
|
||||
printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n");
|
||||
serio_reconnect(psmouse->serio);
|
||||
}
|
||||
break;
|
||||
|
||||
case PSMOUSE_FULL_PACKET:
|
||||
psmouse->pktcnt = 0;
|
||||
if (psmouse->out_of_sync) {
|
||||
psmouse->out_of_sync = 0;
|
||||
printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n",
|
||||
psmouse->name, psmouse->phys);
|
||||
}
|
||||
break;
|
||||
|
||||
case PSMOUSE_GOOD_DATA:
|
||||
break;
|
||||
}
|
||||
out:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_sendbyte() sends a byte to the mouse, and waits for acknowledge.
|
||||
* It doesn't handle retransmission, though it could - because when there would
|
||||
* be need for retransmissions, the mouse has to be replaced anyway.
|
||||
*
|
||||
* psmouse_sendbyte() can only be called from a process context
|
||||
*/
|
||||
|
||||
static int psmouse_sendbyte(struct psmouse *psmouse, unsigned char byte)
|
||||
{
|
||||
psmouse->nak = 1;
|
||||
set_bit(PSMOUSE_FLAG_ACK, &psmouse->flags);
|
||||
|
||||
if (serio_write(psmouse->serio, byte) == 0)
|
||||
wait_event_interruptible_timeout(psmouse->wait,
|
||||
!test_bit(PSMOUSE_FLAG_ACK, &psmouse->flags),
|
||||
msecs_to_jiffies(200));
|
||||
|
||||
clear_bit(PSMOUSE_FLAG_ACK, &psmouse->flags);
|
||||
return -psmouse->nak;
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_command() sends a command and its parameters to the mouse,
|
||||
* then waits for the response and puts it in the param array.
|
||||
*
|
||||
* psmouse_command() can only be called from a process context
|
||||
*/
|
||||
|
||||
int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command)
|
||||
{
|
||||
int timeout;
|
||||
int send = (command >> 12) & 0xf;
|
||||
int receive = (command >> 8) & 0xf;
|
||||
int rc = -1;
|
||||
int i;
|
||||
|
||||
timeout = msecs_to_jiffies(command == PSMOUSE_CMD_RESET_BAT ? 4000 : 500);
|
||||
|
||||
clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
|
||||
if (command == PSMOUSE_CMD_GETID)
|
||||
set_bit(PSMOUSE_FLAG_WAITID, &psmouse->flags);
|
||||
|
||||
if (receive && param)
|
||||
for (i = 0; i < receive; i++)
|
||||
psmouse->cmdbuf[(receive - 1) - i] = param[i];
|
||||
|
||||
psmouse->cmdcnt = receive;
|
||||
|
||||
if (command & 0xff)
|
||||
if (psmouse_sendbyte(psmouse, command & 0xff))
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < send; i++)
|
||||
if (psmouse_sendbyte(psmouse, param[i]))
|
||||
goto out;
|
||||
|
||||
timeout = wait_event_interruptible_timeout(psmouse->wait,
|
||||
!test_bit(PSMOUSE_FLAG_CMD1, &psmouse->flags), timeout);
|
||||
|
||||
if (psmouse->cmdcnt && timeout > 0) {
|
||||
if (command == PSMOUSE_CMD_RESET_BAT && jiffies_to_msecs(timeout) > 100)
|
||||
timeout = msecs_to_jiffies(100);
|
||||
|
||||
if (command == PSMOUSE_CMD_GETID &&
|
||||
psmouse->cmdbuf[receive - 1] != 0xab && psmouse->cmdbuf[receive - 1] != 0xac) {
|
||||
/*
|
||||
* Device behind the port is not a keyboard
|
||||
* so we don't need to wait for the 2nd byte
|
||||
* of ID response.
|
||||
*/
|
||||
clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
|
||||
psmouse->cmdcnt = 0;
|
||||
}
|
||||
|
||||
wait_event_interruptible_timeout(psmouse->wait,
|
||||
!test_bit(PSMOUSE_FLAG_CMD, &psmouse->flags), timeout);
|
||||
}
|
||||
|
||||
if (param)
|
||||
for (i = 0; i < receive; i++)
|
||||
param[i] = psmouse->cmdbuf[(receive - 1) - i];
|
||||
|
||||
if (psmouse->cmdcnt && (command != PSMOUSE_CMD_RESET_BAT || psmouse->cmdcnt != 1))
|
||||
goto out;
|
||||
|
||||
rc = 0;
|
||||
|
||||
out:
|
||||
clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
|
||||
clear_bit(PSMOUSE_FLAG_CMD1, &psmouse->flags);
|
||||
clear_bit(PSMOUSE_FLAG_WAITID, &psmouse->flags);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_sliced_command() sends an extended PS/2 command to the mouse
|
||||
* using sliced syntax, understood by advanced devices, such as Logitech
|
||||
* or Synaptics touchpads. The command is encoded as:
|
||||
* 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
|
||||
* is the command.
|
||||
*/
|
||||
int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11))
|
||||
return -1;
|
||||
|
||||
for (i = 6; i >= 0; i -= 2) {
|
||||
unsigned char d = (command >> i) & 3;
|
||||
if (psmouse_command(psmouse, &d, PSMOUSE_CMD_SETRES))
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* psmouse_reset() resets the mouse into power-on state.
|
||||
*/
|
||||
int psmouse_reset(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[2];
|
||||
|
||||
if (psmouse_command(psmouse, param, PSMOUSE_CMD_RESET_BAT))
|
||||
return -1;
|
||||
|
||||
if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Genius NetMouse magic init.
|
||||
*/
|
||||
static int genius_detect(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[4];
|
||||
|
||||
param[0] = 3;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
|
||||
|
||||
return param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55;
|
||||
}
|
||||
|
||||
/*
|
||||
* IntelliMouse magic init.
|
||||
*/
|
||||
static int intellimouse_detect(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[2];
|
||||
|
||||
param[0] = 200;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
|
||||
param[0] = 100;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
|
||||
param[0] = 80;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
|
||||
|
||||
return param[0] == 3;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try IntelliMouse/Explorer magic init.
|
||||
*/
|
||||
static int im_explorer_detect(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[2];
|
||||
|
||||
intellimouse_detect(psmouse);
|
||||
|
||||
param[0] = 200;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
|
||||
param[0] = 200;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
|
||||
param[0] = 80;
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
|
||||
|
||||
return param[0] == 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_extensions() probes for any extensions to the basic PS/2 protocol
|
||||
* the mouse may have.
|
||||
*/
|
||||
|
||||
static int psmouse_extensions(struct psmouse *psmouse,
|
||||
unsigned int max_proto, int set_properties)
|
||||
{
|
||||
int synaptics_hardware = 0;
|
||||
|
||||
/*
|
||||
* Try Synaptics TouchPad
|
||||
*/
|
||||
if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse)) {
|
||||
synaptics_hardware = 1;
|
||||
|
||||
if (set_properties) {
|
||||
psmouse->vendor = "Synaptics";
|
||||
psmouse->name = "TouchPad";
|
||||
}
|
||||
|
||||
if (max_proto > PSMOUSE_IMEX) {
|
||||
if (!set_properties || synaptics_init(psmouse) == 0)
|
||||
return PSMOUSE_SYNAPTICS;
|
||||
/*
|
||||
* Some Synaptics touchpads can emulate extended protocols (like IMPS/2).
|
||||
* Unfortunately Logitech/Genius probes confuse some firmware versions so
|
||||
* we'll have to skip them.
|
||||
*/
|
||||
max_proto = PSMOUSE_IMEX;
|
||||
}
|
||||
/*
|
||||
* Make sure that touchpad is in relative mode, gestures (taps) are enabled
|
||||
*/
|
||||
synaptics_reset(psmouse);
|
||||
}
|
||||
|
||||
if (max_proto > PSMOUSE_IMEX && genius_detect(psmouse)) {
|
||||
|
||||
if (set_properties) {
|
||||
set_bit(BTN_EXTRA, psmouse->dev.keybit);
|
||||
set_bit(BTN_SIDE, psmouse->dev.keybit);
|
||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||
psmouse->vendor = "Genius";
|
||||
psmouse->name = "Wheel Mouse";
|
||||
}
|
||||
|
||||
return PSMOUSE_GENPS;
|
||||
}
|
||||
|
||||
if (max_proto > PSMOUSE_IMEX) {
|
||||
int type = ps2pp_init(psmouse, set_properties);
|
||||
if (type > PSMOUSE_PS2)
|
||||
return type;
|
||||
}
|
||||
|
||||
if (max_proto >= PSMOUSE_IMEX && im_explorer_detect(psmouse)) {
|
||||
|
||||
if (set_properties) {
|
||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||
set_bit(BTN_SIDE, psmouse->dev.keybit);
|
||||
set_bit(BTN_EXTRA, psmouse->dev.keybit);
|
||||
if (!psmouse->name)
|
||||
psmouse->name = "Explorer Mouse";
|
||||
}
|
||||
|
||||
return PSMOUSE_IMEX;
|
||||
}
|
||||
|
||||
if (max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse)) {
|
||||
|
||||
if (set_properties) {
|
||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||
if (!psmouse->name)
|
||||
psmouse->name = "Wheel Mouse";
|
||||
}
|
||||
|
||||
return PSMOUSE_IMPS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Okay, all failed, we have a standard mouse here. The number of the buttons
|
||||
* is still a question, though. We assume 3.
|
||||
*/
|
||||
if (synaptics_hardware) {
|
||||
/*
|
||||
* We detected Synaptics hardware but it did not respond to IMPS/2 probes.
|
||||
* We need to reset the touchpad because if there is a track point on the
|
||||
* pass through port it could get disabled while probing for protocol
|
||||
* extensions.
|
||||
*/
|
||||
psmouse_reset(psmouse);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_RESET_DIS);
|
||||
}
|
||||
|
||||
return PSMOUSE_PS2;
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_probe() probes for a PS/2 mouse.
|
||||
*/
|
||||
|
||||
static int psmouse_probe(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[2];
|
||||
|
||||
/*
|
||||
* First, we check if it's a mouse. It should send 0x00 or 0x03
|
||||
* in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.
|
||||
*/
|
||||
|
||||
param[0] = 0xa5;
|
||||
|
||||
if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETID))
|
||||
return -1;
|
||||
|
||||
if (param[0] != 0x00 && param[0] != 0x03 && param[0] != 0x04)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Then we reset and disable the mouse so that it doesn't generate events.
|
||||
*/
|
||||
|
||||
if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_RESET_DIS))
|
||||
printk(KERN_WARNING "psmouse.c: Failed to reset mouse on %s\n", psmouse->serio->phys);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Here we set the mouse resolution.
|
||||
*/
|
||||
|
||||
static void psmouse_set_resolution(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[1];
|
||||
|
||||
if (psmouse->type == PSMOUSE_PS2PP && psmouse_resolution > 400) {
|
||||
ps2pp_set_800dpi(psmouse);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!psmouse_resolution || psmouse_resolution >= 200)
|
||||
param[0] = 3;
|
||||
else if (psmouse_resolution >= 100)
|
||||
param[0] = 2;
|
||||
else if (psmouse_resolution >= 50)
|
||||
param[0] = 1;
|
||||
else if (psmouse_resolution)
|
||||
param[0] = 0;
|
||||
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
}
|
||||
|
||||
/*
|
||||
* Here we set the mouse report rate.
|
||||
*/
|
||||
|
||||
static void psmouse_set_rate(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 };
|
||||
int i = 0;
|
||||
|
||||
while (rates[i] > psmouse_rate) i++;
|
||||
psmouse_command(psmouse, rates + i, PSMOUSE_CMD_SETRATE);
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_initialize() initializes the mouse to a sane state.
|
||||
*/
|
||||
|
||||
static void psmouse_initialize(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[2];
|
||||
|
||||
/*
|
||||
* We set the mouse report rate, resolution and scaling.
|
||||
*/
|
||||
|
||||
if (psmouse_max_proto != PSMOUSE_PS2) {
|
||||
psmouse_set_rate(psmouse);
|
||||
psmouse_set_resolution(psmouse);
|
||||
psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
|
||||
}
|
||||
|
||||
/*
|
||||
* We set the mouse into streaming mode.
|
||||
*/
|
||||
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETSTREAM);
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_set_state() sets new psmouse state and resets all flags and
|
||||
* counters while holding serio lock so fighting with interrupt handler
|
||||
* is not a concern.
|
||||
*/
|
||||
|
||||
static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
|
||||
{
|
||||
serio_pause_rx(psmouse->serio);
|
||||
psmouse->state = new_state;
|
||||
psmouse->pktcnt = psmouse->cmdcnt = psmouse->out_of_sync = 0;
|
||||
psmouse->flags = 0;
|
||||
serio_continue_rx(psmouse->serio);
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_activate() enables the mouse so that we get motion reports from it.
|
||||
*/
|
||||
|
||||
static void psmouse_activate(struct psmouse *psmouse)
|
||||
{
|
||||
if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_ENABLE))
|
||||
printk(KERN_WARNING "psmouse.c: Failed to enable mouse on %s\n", psmouse->serio->phys);
|
||||
|
||||
psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* psmouse_deactivate() puts the mouse into poll mode so that we don't get motion
|
||||
* reports from it unless we explicitely request it.
|
||||
*/
|
||||
|
||||
static void psmouse_deactivate(struct psmouse *psmouse)
|
||||
{
|
||||
if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE))
|
||||
printk(KERN_WARNING "psmouse.c: Failed to deactivate mouse on %s\n", psmouse->serio->phys);
|
||||
|
||||
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* psmouse_cleanup() resets the mouse into power-on state.
|
||||
*/
|
||||
|
||||
static void psmouse_cleanup(struct serio *serio)
|
||||
{
|
||||
struct psmouse *psmouse = serio->private;
|
||||
|
||||
psmouse_reset(psmouse);
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_disconnect() closes and frees.
|
||||
*/
|
||||
|
||||
static void psmouse_disconnect(struct serio *serio)
|
||||
{
|
||||
struct psmouse *psmouse, *parent;
|
||||
|
||||
psmouse = serio->private;
|
||||
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
||||
|
||||
if (serio->parent && (serio->type & SERIO_TYPE) == SERIO_PS_PSTHRU) {
|
||||
parent = serio->parent->private;
|
||||
if (parent->pt_deactivate)
|
||||
parent->pt_deactivate(parent);
|
||||
}
|
||||
|
||||
if (psmouse->disconnect)
|
||||
psmouse->disconnect(psmouse);
|
||||
|
||||
psmouse_set_state(psmouse, PSMOUSE_IGNORE);
|
||||
|
||||
input_unregister_device(&psmouse->dev);
|
||||
serio_close(serio);
|
||||
kfree(psmouse);
|
||||
}
|
||||
|
||||
/*
|
||||
* psmouse_connect() is a callback from the serio module when
|
||||
* an unhandled serio port is found.
|
||||
*/
|
||||
static void psmouse_connect(struct serio *serio, struct serio_driver *drv)
|
||||
{
|
||||
struct psmouse *psmouse, *parent = NULL;
|
||||
|
||||
if ((serio->type & SERIO_TYPE) != SERIO_8042 &&
|
||||
(serio->type & SERIO_TYPE) != SERIO_PS_PSTHRU)
|
||||
return;
|
||||
|
||||
/*
|
||||
* If this is a pass-through port deactivate parent so the device
|
||||
* connected to this port can be successfully identified
|
||||
*/
|
||||
if (serio->parent && (serio->type & SERIO_TYPE) == SERIO_PS_PSTHRU) {
|
||||
parent = serio->parent->private;
|
||||
psmouse_deactivate(parent);
|
||||
}
|
||||
|
||||
if (!(psmouse = kmalloc(sizeof(struct psmouse), GFP_KERNEL)))
|
||||
goto out;
|
||||
|
||||
memset(psmouse, 0, sizeof(struct psmouse));
|
||||
|
||||
init_waitqueue_head(&psmouse->wait);
|
||||
init_input_dev(&psmouse->dev);
|
||||
psmouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
psmouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
|
||||
psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
|
||||
psmouse->serio = serio;
|
||||
psmouse->dev.private = psmouse;
|
||||
psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
|
||||
|
||||
serio->private = psmouse;
|
||||
if (serio_open(serio, drv)) {
|
||||
kfree(psmouse);
|
||||
serio->private = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (psmouse_probe(psmouse) < 0) {
|
||||
serio_close(serio);
|
||||
kfree(psmouse);
|
||||
serio->private = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1);
|
||||
if (!psmouse->vendor)
|
||||
psmouse->vendor = "Generic";
|
||||
if (!psmouse->name)
|
||||
psmouse->name = "Mouse";
|
||||
if (!psmouse->protocol_handler)
|
||||
psmouse->protocol_handler = psmouse_process_byte;
|
||||
|
||||
sprintf(psmouse->devname, "%s %s %s",
|
||||
psmouse_protocols[psmouse->type], psmouse->vendor, psmouse->name);
|
||||
sprintf(psmouse->phys, "%s/input0",
|
||||
serio->phys);
|
||||
|
||||
psmouse->dev.name = psmouse->devname;
|
||||
psmouse->dev.phys = psmouse->phys;
|
||||
psmouse->dev.id.bustype = BUS_I8042;
|
||||
psmouse->dev.id.vendor = 0x0002;
|
||||
psmouse->dev.id.product = psmouse->type;
|
||||
psmouse->dev.id.version = psmouse->model;
|
||||
|
||||
input_register_device(&psmouse->dev);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys);
|
||||
|
||||
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
||||
|
||||
psmouse_initialize(psmouse);
|
||||
|
||||
if (parent && parent->pt_activate)
|
||||
parent->pt_activate(parent);
|
||||
|
||||
if (serio->child) {
|
||||
/*
|
||||
* Nothing to be done here, serio core will detect that
|
||||
* the driver set serio->child and will register it for us.
|
||||
*/
|
||||
printk(KERN_INFO "serio: %s port at %s\n", serio->child->name, psmouse->phys);
|
||||
}
|
||||
|
||||
psmouse_activate(psmouse);
|
||||
|
||||
out:
|
||||
/* If this is a pass-through port the parent awaits to be activated */
|
||||
if (parent)
|
||||
psmouse_activate(parent);
|
||||
}
|
||||
|
||||
|
||||
static int psmouse_reconnect(struct serio *serio)
|
||||
{
|
||||
struct psmouse *psmouse = serio->private;
|
||||
struct psmouse *parent = NULL;
|
||||
struct serio_driver *drv = serio->drv;
|
||||
int rc = -1;
|
||||
|
||||
if (!drv || !psmouse) {
|
||||
printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (serio->parent && (serio->type & SERIO_TYPE) == SERIO_PS_PSTHRU) {
|
||||
parent = serio->parent->private;
|
||||
psmouse_deactivate(parent);
|
||||
}
|
||||
|
||||
psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
|
||||
|
||||
if (psmouse->reconnect) {
|
||||
if (psmouse->reconnect(psmouse))
|
||||
goto out;
|
||||
} else if (psmouse_probe(psmouse) < 0 ||
|
||||
psmouse->type != psmouse_extensions(psmouse, psmouse_max_proto, 0))
|
||||
goto out;
|
||||
|
||||
/* ok, the device type (and capabilities) match the old one,
|
||||
* we can continue using it, complete intialization
|
||||
*/
|
||||
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
|
||||
|
||||
psmouse_initialize(psmouse);
|
||||
|
||||
if (parent && parent->pt_activate)
|
||||
parent->pt_activate(parent);
|
||||
|
||||
psmouse_activate(psmouse);
|
||||
rc = 0;
|
||||
|
||||
out:
|
||||
/* If this is a pass-through port the parent waits to be activated */
|
||||
if (parent)
|
||||
psmouse_activate(parent);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
static struct serio_driver psmouse_drv = {
|
||||
.driver = {
|
||||
.name = "psmouse",
|
||||
},
|
||||
.description = DRIVER_DESC,
|
||||
.interrupt = psmouse_interrupt,
|
||||
.connect = psmouse_connect,
|
||||
.reconnect = psmouse_reconnect,
|
||||
.disconnect = psmouse_disconnect,
|
||||
.cleanup = psmouse_cleanup,
|
||||
};
|
||||
|
||||
static inline void psmouse_parse_proto(void)
|
||||
{
|
||||
if (psmouse_proto) {
|
||||
if (!strcmp(psmouse_proto, "bare"))
|
||||
psmouse_max_proto = PSMOUSE_PS2;
|
||||
else if (!strcmp(psmouse_proto, "imps"))
|
||||
psmouse_max_proto = PSMOUSE_IMPS;
|
||||
else if (!strcmp(psmouse_proto, "exps"))
|
||||
psmouse_max_proto = PSMOUSE_IMEX;
|
||||
else
|
||||
printk(KERN_ERR "psmouse: unknown protocol type '%s'\n", psmouse_proto);
|
||||
}
|
||||
}
|
||||
|
||||
int __init psmouse_init(void)
|
||||
{
|
||||
psmouse_parse_proto();
|
||||
serio_register_driver(&psmouse_drv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __exit psmouse_exit(void)
|
||||
{
|
||||
serio_unregister_driver(&psmouse_drv);
|
||||
}
|
||||
|
||||
module_init(psmouse_init);
|
||||
module_exit(psmouse_exit);
|
||||
BIN
extra/linux-2.6.10/drivers/input/mouse/psmouse-base.o
Normal file
BIN
extra/linux-2.6.10/drivers/input/mouse/psmouse-base.o
Normal file
Binary file not shown.
87
extra/linux-2.6.10/drivers/input/mouse/psmouse.h
Normal file
87
extra/linux-2.6.10/drivers/input/mouse/psmouse.h
Normal file
@@ -0,0 +1,87 @@
|
||||
#ifndef _PSMOUSE_H
|
||||
#define _PSMOUSE_H
|
||||
|
||||
#define PSMOUSE_CMD_SETSCALE11 0x00e6
|
||||
#define PSMOUSE_CMD_SETRES 0x10e8
|
||||
#define PSMOUSE_CMD_GETINFO 0x03e9
|
||||
#define PSMOUSE_CMD_SETSTREAM 0x00ea
|
||||
#define PSMOUSE_CMD_POLL 0x03eb
|
||||
#define PSMOUSE_CMD_GETID 0x02f2
|
||||
#define PSMOUSE_CMD_SETRATE 0x10f3
|
||||
#define PSMOUSE_CMD_ENABLE 0x00f4
|
||||
#define PSMOUSE_CMD_DISABLE 0x00f5
|
||||
#define PSMOUSE_CMD_RESET_DIS 0x00f6
|
||||
#define PSMOUSE_CMD_RESET_BAT 0x02ff
|
||||
|
||||
#define PSMOUSE_RET_BAT 0xaa
|
||||
#define PSMOUSE_RET_ID 0x00
|
||||
#define PSMOUSE_RET_ACK 0xfa
|
||||
#define PSMOUSE_RET_NAK 0xfe
|
||||
|
||||
#define PSMOUSE_FLAG_ACK 0 /* Waiting for ACK/NAK */
|
||||
#define PSMOUSE_FLAG_CMD 1 /* Waiting for command to finish */
|
||||
#define PSMOUSE_FLAG_CMD1 2 /* Waiting for the first byte of command response */
|
||||
#define PSMOUSE_FLAG_WAITID 3 /* Command execiting is GET ID */
|
||||
|
||||
enum psmouse_state {
|
||||
PSMOUSE_IGNORE,
|
||||
PSMOUSE_INITIALIZING,
|
||||
PSMOUSE_CMD_MODE,
|
||||
PSMOUSE_ACTIVATED,
|
||||
};
|
||||
|
||||
/* psmouse protocol handler return codes */
|
||||
typedef enum {
|
||||
PSMOUSE_BAD_DATA,
|
||||
PSMOUSE_GOOD_DATA,
|
||||
PSMOUSE_FULL_PACKET
|
||||
} psmouse_ret_t;
|
||||
|
||||
struct psmouse {
|
||||
void *private;
|
||||
struct input_dev dev;
|
||||
struct serio *serio;
|
||||
char *vendor;
|
||||
char *name;
|
||||
unsigned char cmdbuf[8];
|
||||
unsigned char packet[8];
|
||||
unsigned char cmdcnt;
|
||||
unsigned char pktcnt;
|
||||
unsigned char type;
|
||||
unsigned char model;
|
||||
unsigned long last;
|
||||
unsigned long out_of_sync;
|
||||
enum psmouse_state state;
|
||||
unsigned char nak;
|
||||
char error;
|
||||
char devname[64];
|
||||
char phys[32];
|
||||
unsigned long flags;
|
||||
|
||||
/* Used to signal completion from interrupt handler */
|
||||
wait_queue_head_t wait;
|
||||
|
||||
psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse, struct pt_regs *regs);
|
||||
int (*reconnect)(struct psmouse *psmouse);
|
||||
void (*disconnect)(struct psmouse *psmouse);
|
||||
|
||||
void (*pt_activate)(struct psmouse *psmouse);
|
||||
void (*pt_deactivate)(struct psmouse *psmouse);
|
||||
};
|
||||
|
||||
#define PSMOUSE_PS2 1
|
||||
#define PSMOUSE_PS2PP 2
|
||||
#define PSMOUSE_PS2TPP 3
|
||||
#define PSMOUSE_GENPS 4
|
||||
#define PSMOUSE_IMPS 5
|
||||
#define PSMOUSE_IMEX 6
|
||||
#define PSMOUSE_SYNAPTICS 7
|
||||
|
||||
int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command);
|
||||
int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command);
|
||||
int psmouse_reset(struct psmouse *psmouse);
|
||||
|
||||
extern int psmouse_smartscroll;
|
||||
extern unsigned int psmouse_rate;
|
||||
|
||||
#endif /* _PSMOUSE_H */
|
||||
BIN
extra/linux-2.6.10/drivers/input/mouse/psmouse.o
Normal file
BIN
extra/linux-2.6.10/drivers/input/mouse/psmouse.o
Normal file
Binary file not shown.
107
extra/linux-2.6.10/drivers/input/mouse/rpcmouse.c
Normal file
107
extra/linux-2.6.10/drivers/input/mouse/rpcmouse.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Acorn RiscPC mouse driver for Linux/ARM
|
||||
*
|
||||
* Copyright (c) 2000-2002 Vojtech Pavlik
|
||||
* Copyright (C) 1996-2002 Russell King
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This handles the Acorn RiscPCs mouse. We basically have a couple of
|
||||
* hardware registers that track the sensor count for the X-Y movement and
|
||||
* another register holding the button state. On every VSYNC interrupt we read
|
||||
* the complete state and then work out if something has changed.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/hardware/iomd.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik, Russell King");
|
||||
MODULE_DESCRIPTION("Acorn RiscPC mouse driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static short rpcmouse_lastx, rpcmouse_lasty;
|
||||
|
||||
static struct input_dev rpcmouse_dev = {
|
||||
.evbit = { BIT(EV_KEY) | BIT(EV_REL) },
|
||||
.keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },
|
||||
.relbit = { BIT(REL_X) | BIT(REL_Y) },
|
||||
.name = "Acorn RiscPC Mouse",
|
||||
.phys = "rpcmouse/input0",
|
||||
.id = {
|
||||
.bustype = BUS_HOST,
|
||||
.vendor = 0x0005,
|
||||
.product = 0x0001,
|
||||
.version = 0x0100,
|
||||
},
|
||||
};
|
||||
|
||||
static irqreturn_t rpcmouse_irq(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = dev_id;
|
||||
short x, y, dx, dy, b;
|
||||
|
||||
x = (short) iomd_readl(IOMD_MOUSEX);
|
||||
y = (short) iomd_readl(IOMD_MOUSEY);
|
||||
b = (short) (__raw_readl(0xe0310000) ^ 0x70);
|
||||
|
||||
dx = x - rpcmouse_lastx;
|
||||
dy = y - rpcmouse_lasty;
|
||||
|
||||
rpcmouse_lastx = x;
|
||||
rpcmouse_lasty = y;
|
||||
|
||||
input_regs(dev, regs);
|
||||
|
||||
input_report_rel(dev, REL_X, dx);
|
||||
input_report_rel(dev, REL_Y, -dy);
|
||||
|
||||
input_report_key(dev, BTN_LEFT, b & 0x40);
|
||||
input_report_key(dev, BTN_MIDDLE, b & 0x20);
|
||||
input_report_key(dev, BTN_RIGHT, b & 0x10);
|
||||
|
||||
input_sync(dev);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __init rpcmouse_init(void)
|
||||
{
|
||||
init_input_dev(&rpcmouse_dev);
|
||||
|
||||
rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX);
|
||||
rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY);
|
||||
|
||||
if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", &rpcmouse_dev)) {
|
||||
printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
input_register_device(&rpcmouse_dev);
|
||||
|
||||
printk(KERN_INFO "input: Acorn RiscPC mouse\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit rpcmouse_exit(void)
|
||||
{
|
||||
input_unregister_device(&rpcmouse_dev);
|
||||
free_irq(IRQ_VSYNCPULSE, &rpcmouse_dev);
|
||||
}
|
||||
|
||||
module_init(rpcmouse_init);
|
||||
module_exit(rpcmouse_exit);
|
||||
316
extra/linux-2.6.10/drivers/input/mouse/sermouse.c
Normal file
316
extra/linux-2.6.10/drivers/input/mouse/sermouse.c
Normal file
@@ -0,0 +1,316 @@
|
||||
/*
|
||||
* $Id: sermouse.c,v 1.17 2002/03/13 10:03:43 vojtech Exp $
|
||||
*
|
||||
* Copyright (c) 1999-2001 Vojtech Pavlik
|
||||
*/
|
||||
|
||||
/*
|
||||
* Serial mouse driver for Linux
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Should you need to contact me, the author, you can do so either by
|
||||
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
|
||||
* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/serio.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#define DRIVER_DESC "Serial mouse driver"
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static char *sermouse_protocols[] = { "None", "Mouse Systems Mouse", "Sun Mouse", "Microsoft Mouse",
|
||||
"Logitech M+ Mouse", "Microsoft MZ Mouse", "Logitech MZ+ Mouse",
|
||||
"Logitech MZ++ Mouse"};
|
||||
|
||||
struct sermouse {
|
||||
struct input_dev dev;
|
||||
signed char buf[8];
|
||||
unsigned char count;
|
||||
unsigned char type;
|
||||
unsigned long last;
|
||||
char phys[32];
|
||||
};
|
||||
|
||||
/*
|
||||
* sermouse_process_msc() analyzes the incoming MSC/Sun bytestream and
|
||||
* applies some prediction to the data, resulting in 96 updates per
|
||||
* second, which is as good as a PS/2 or USB mouse.
|
||||
*/
|
||||
|
||||
static void sermouse_process_msc(struct sermouse *sermouse, signed char data, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &sermouse->dev;
|
||||
signed char *buf = sermouse->buf;
|
||||
|
||||
input_regs(dev, regs);
|
||||
|
||||
switch (sermouse->count) {
|
||||
|
||||
case 0:
|
||||
if ((data & 0xf8) != 0x80) return;
|
||||
input_report_key(dev, BTN_LEFT, !(data & 4));
|
||||
input_report_key(dev, BTN_RIGHT, !(data & 1));
|
||||
input_report_key(dev, BTN_MIDDLE, !(data & 2));
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 3:
|
||||
input_report_rel(dev, REL_X, data / 2);
|
||||
input_report_rel(dev, REL_Y, -buf[1]);
|
||||
buf[0] = data - data / 2;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 4:
|
||||
input_report_rel(dev, REL_X, buf[0]);
|
||||
input_report_rel(dev, REL_Y, buf[1] - data);
|
||||
buf[1] = data / 2;
|
||||
break;
|
||||
}
|
||||
|
||||
input_sync(dev);
|
||||
|
||||
if (++sermouse->count == (5 - ((sermouse->type == SERIO_SUN) << 1)))
|
||||
sermouse->count = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sermouse_process_ms() anlyzes the incoming MS(Z/+/++) bytestream and
|
||||
* generates events. With prediction it gets 80 updates/sec, assuming
|
||||
* standard 3-byte packets and 1200 bps.
|
||||
*/
|
||||
|
||||
static void sermouse_process_ms(struct sermouse *sermouse, signed char data, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &sermouse->dev;
|
||||
signed char *buf = sermouse->buf;
|
||||
|
||||
if (data & 0x40) sermouse->count = 0;
|
||||
|
||||
input_regs(dev, regs);
|
||||
|
||||
switch (sermouse->count) {
|
||||
|
||||
case 0:
|
||||
buf[1] = data;
|
||||
input_report_key(dev, BTN_LEFT, (data >> 5) & 1);
|
||||
input_report_key(dev, BTN_RIGHT, (data >> 4) & 1);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
buf[2] = data;
|
||||
data = (signed char) (((buf[1] << 6) & 0xc0) | (data & 0x3f));
|
||||
input_report_rel(dev, REL_X, data / 2);
|
||||
input_report_rel(dev, REL_Y, buf[4]);
|
||||
buf[3] = data - data / 2;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
/* Guessing the state of the middle button on 3-button MS-protocol mice - ugly. */
|
||||
if ((sermouse->type == SERIO_MS) && !data && !buf[2] && !((buf[0] & 0xf0) ^ buf[1]))
|
||||
input_report_key(dev, BTN_MIDDLE, !test_bit(BTN_MIDDLE, dev->key));
|
||||
buf[0] = buf[1];
|
||||
|
||||
data = (signed char) (((buf[1] << 4) & 0xc0) | (data & 0x3f));
|
||||
input_report_rel(dev, REL_X, buf[3]);
|
||||
input_report_rel(dev, REL_Y, data - buf[4]);
|
||||
buf[4] = data / 2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
|
||||
switch (sermouse->type) {
|
||||
|
||||
case SERIO_MS:
|
||||
sermouse->type = SERIO_MP;
|
||||
|
||||
case SERIO_MP:
|
||||
if ((data >> 2) & 3) break; /* M++ Wireless Extension packet. */
|
||||
input_report_key(dev, BTN_MIDDLE, (data >> 5) & 1);
|
||||
input_report_key(dev, BTN_SIDE, (data >> 4) & 1);
|
||||
break;
|
||||
|
||||
case SERIO_MZP:
|
||||
case SERIO_MZPP:
|
||||
input_report_key(dev, BTN_SIDE, (data >> 5) & 1);
|
||||
|
||||
case SERIO_MZ:
|
||||
input_report_key(dev, BTN_MIDDLE, (data >> 4) & 1);
|
||||
input_report_rel(dev, REL_WHEEL, (data & 8) - (data & 7));
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 4:
|
||||
case 6: /* MZ++ packet type. We can get these bytes for M++ too but we ignore them later. */
|
||||
buf[1] = (data >> 2) & 0x0f;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
case 7: /* Ignore anything besides MZ++ */
|
||||
if (sermouse->type != SERIO_MZPP) break;
|
||||
|
||||
switch (buf[1]) {
|
||||
|
||||
case 1: /* Extra mouse info */
|
||||
|
||||
input_report_key(dev, BTN_SIDE, (data >> 4) & 1);
|
||||
input_report_key(dev, BTN_EXTRA, (data >> 5) & 1);
|
||||
input_report_rel(dev, data & 0x80 ? REL_HWHEEL : REL_WHEEL, (data & 7) - (data & 8));
|
||||
|
||||
break;
|
||||
|
||||
default: /* We don't decode anything else yet. */
|
||||
|
||||
printk(KERN_WARNING
|
||||
"sermouse.c: Received MZ++ packet %x, don't know how to handle.\n", buf[1]);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
input_sync(dev);
|
||||
|
||||
sermouse->count++;
|
||||
}
|
||||
|
||||
/*
|
||||
* sermouse_interrupt() handles incoming characters, either gathering them into
|
||||
* packets or passing them to the command routine as command output.
|
||||
*/
|
||||
|
||||
static irqreturn_t sermouse_interrupt(struct serio *serio,
|
||||
unsigned char data, unsigned int flags, struct pt_regs *regs)
|
||||
{
|
||||
struct sermouse *sermouse = serio->private;
|
||||
|
||||
if (time_after(jiffies, sermouse->last + HZ/10)) sermouse->count = 0;
|
||||
sermouse->last = jiffies;
|
||||
|
||||
if (sermouse->type > SERIO_SUN)
|
||||
sermouse_process_ms(sermouse, data, regs);
|
||||
else
|
||||
sermouse_process_msc(sermouse, data, regs);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* sermouse_disconnect() cleans up after we don't want talk
|
||||
* to the mouse anymore.
|
||||
*/
|
||||
|
||||
static void sermouse_disconnect(struct serio *serio)
|
||||
{
|
||||
struct sermouse *sermouse = serio->private;
|
||||
input_unregister_device(&sermouse->dev);
|
||||
serio_close(serio);
|
||||
kfree(sermouse);
|
||||
}
|
||||
|
||||
/*
|
||||
* sermouse_connect() is a callback form the serio module when
|
||||
* an unhandled serio port is found.
|
||||
*/
|
||||
|
||||
static void sermouse_connect(struct serio *serio, struct serio_driver *drv)
|
||||
{
|
||||
struct sermouse *sermouse;
|
||||
unsigned char c;
|
||||
|
||||
if ((serio->type & SERIO_TYPE) != SERIO_RS232)
|
||||
return;
|
||||
|
||||
if (!(serio->type & SERIO_PROTO) || ((serio->type & SERIO_PROTO) > SERIO_MZPP))
|
||||
return;
|
||||
|
||||
if (!(sermouse = kmalloc(sizeof(struct sermouse), GFP_KERNEL)))
|
||||
return;
|
||||
|
||||
memset(sermouse, 0, sizeof(struct sermouse));
|
||||
|
||||
init_input_dev(&sermouse->dev);
|
||||
sermouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
sermouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT);
|
||||
sermouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
|
||||
sermouse->dev.private = sermouse;
|
||||
|
||||
serio->private = sermouse;
|
||||
|
||||
sermouse->type = serio->type & SERIO_PROTO;
|
||||
c = (serio->type & SERIO_EXTRA) >> 16;
|
||||
|
||||
if (c & 0x01) set_bit(BTN_MIDDLE, sermouse->dev.keybit);
|
||||
if (c & 0x02) set_bit(BTN_SIDE, sermouse->dev.keybit);
|
||||
if (c & 0x04) set_bit(BTN_EXTRA, sermouse->dev.keybit);
|
||||
if (c & 0x10) set_bit(REL_WHEEL, sermouse->dev.relbit);
|
||||
if (c & 0x20) set_bit(REL_HWHEEL, sermouse->dev.relbit);
|
||||
|
||||
sprintf(sermouse->phys, "%s/input0", serio->phys);
|
||||
|
||||
sermouse->dev.name = sermouse_protocols[sermouse->type];
|
||||
sermouse->dev.phys = sermouse->phys;
|
||||
sermouse->dev.id.bustype = BUS_RS232;
|
||||
sermouse->dev.id.vendor = sermouse->type;
|
||||
sermouse->dev.id.product = c;
|
||||
sermouse->dev.id.version = 0x0100;
|
||||
|
||||
if (serio_open(serio, drv)) {
|
||||
kfree(sermouse);
|
||||
return;
|
||||
}
|
||||
|
||||
input_register_device(&sermouse->dev);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", sermouse_protocols[sermouse->type], serio->phys);
|
||||
}
|
||||
|
||||
static struct serio_driver sermouse_drv = {
|
||||
.driver = {
|
||||
.name = "sermouse",
|
||||
},
|
||||
.description = DRIVER_DESC,
|
||||
.interrupt = sermouse_interrupt,
|
||||
.connect = sermouse_connect,
|
||||
.disconnect = sermouse_disconnect,
|
||||
};
|
||||
|
||||
int __init sermouse_init(void)
|
||||
{
|
||||
serio_register_driver(&sermouse_drv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __exit sermouse_exit(void)
|
||||
{
|
||||
serio_unregister_driver(&sermouse_drv);
|
||||
}
|
||||
|
||||
module_init(sermouse_init);
|
||||
module_exit(sermouse_exit);
|
||||
615
extra/linux-2.6.10/drivers/input/mouse/synaptics.c
Normal file
615
extra/linux-2.6.10/drivers/input/mouse/synaptics.c
Normal file
@@ -0,0 +1,615 @@
|
||||
/*
|
||||
* Synaptics TouchPad PS/2 mouse driver
|
||||
*
|
||||
* 2003 Dmitry Torokhov <dtor@mail.ru>
|
||||
* Added support for pass-through port. Special thanks to Peter Berg Larsen
|
||||
* for explaining various Synaptics quirks.
|
||||
*
|
||||
* 2003 Peter Osterlund <petero2@telia.com>
|
||||
* Ported to 2.5 input device infrastructure.
|
||||
*
|
||||
* Copyright (C) 2001 Stefan Gmeiner <riddlebox@freesurf.ch>
|
||||
* start merging tpconfig and gpm code to a xfree-input module
|
||||
* adding some changes and extensions (ex. 3rd and 4th button)
|
||||
*
|
||||
* Copyright (c) 1997 C. Scott Ananian <cananian@alumni.priceton.edu>
|
||||
* Copyright (c) 1998-2000 Bruce Kalk <kall@compass.com>
|
||||
* code for the special synaptics commands (from the tpconfig-source)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* Trademarks are the property of their respective owners.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/serio.h>
|
||||
#include "psmouse.h"
|
||||
#include "synaptics.h"
|
||||
|
||||
/*
|
||||
* The x/y limits are taken from the Synaptics TouchPad interfacing Guide,
|
||||
* section 2.3.2, which says that they should be valid regardless of the
|
||||
* actual size of the sensor.
|
||||
*/
|
||||
#define XMIN_NOMINAL 1472
|
||||
#define XMAX_NOMINAL 5472
|
||||
#define YMIN_NOMINAL 1408
|
||||
#define YMAX_NOMINAL 4448
|
||||
|
||||
/*****************************************************************************
|
||||
* Synaptics communications functions
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Send a command to the synpatics touchpad by special commands
|
||||
*/
|
||||
static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param)
|
||||
{
|
||||
if (psmouse_sliced_command(psmouse, c))
|
||||
return -1;
|
||||
if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the synaptics touchpad mode byte by special commands
|
||||
*/
|
||||
static int synaptics_mode_cmd(struct psmouse *psmouse, unsigned char mode)
|
||||
{
|
||||
unsigned char param[1];
|
||||
|
||||
if (psmouse_sliced_command(psmouse, mode))
|
||||
return -1;
|
||||
param[0] = SYN_PS_SET_MODE2;
|
||||
if (psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the model-id bytes from the touchpad
|
||||
* see also SYN_MODEL_* macros
|
||||
*/
|
||||
static int synaptics_model_id(struct psmouse *psmouse)
|
||||
{
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
unsigned char mi[3];
|
||||
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_MODEL, mi))
|
||||
return -1;
|
||||
priv->model_id = (mi[0]<<16) | (mi[1]<<8) | mi[2];
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the capability-bits from the touchpad
|
||||
* see also the SYN_CAP_* macros
|
||||
*/
|
||||
static int synaptics_capability(struct psmouse *psmouse)
|
||||
{
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
unsigned char cap[3];
|
||||
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap))
|
||||
return -1;
|
||||
priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||
priv->ext_cap = 0;
|
||||
if (!SYN_CAP_VALID(priv->capabilities))
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Unless capExtended is set the rest of the flags should be ignored
|
||||
*/
|
||||
if (!SYN_CAP_EXTENDED(priv->capabilities))
|
||||
priv->capabilities = 0;
|
||||
|
||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) {
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) {
|
||||
printk(KERN_ERR "Synaptics claims to have extended capabilities,"
|
||||
" but I'm not able to read them.");
|
||||
} else {
|
||||
priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||
|
||||
/*
|
||||
* if nExtBtn is greater than 8 it should be considered
|
||||
* invalid and treated as 0
|
||||
*/
|
||||
if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) > 8)
|
||||
priv->ext_cap &= 0xff0fff;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Identify Touchpad
|
||||
* See also the SYN_ID_* macros
|
||||
*/
|
||||
static int synaptics_identify(struct psmouse *psmouse)
|
||||
{
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
unsigned char id[3];
|
||||
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_IDENTIFY, id))
|
||||
return -1;
|
||||
priv->identity = (id[0]<<16) | (id[1]<<8) | id[2];
|
||||
if (SYN_ID_IS_SYNAPTICS(priv->identity))
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void print_ident(struct synaptics_data *priv)
|
||||
{
|
||||
printk(KERN_INFO "Synaptics Touchpad, model: %ld\n", SYN_ID_MODEL(priv->identity));
|
||||
printk(KERN_INFO " Firmware: %ld.%ld\n", SYN_ID_MAJOR(priv->identity),
|
||||
SYN_ID_MINOR(priv->identity));
|
||||
if (SYN_MODEL_ROT180(priv->model_id))
|
||||
printk(KERN_INFO " 180 degree mounted touchpad\n");
|
||||
if (SYN_MODEL_PORTRAIT(priv->model_id))
|
||||
printk(KERN_INFO " portrait touchpad\n");
|
||||
printk(KERN_INFO " Sensor: %ld\n", SYN_MODEL_SENSOR(priv->model_id));
|
||||
if (SYN_MODEL_NEWABS(priv->model_id))
|
||||
printk(KERN_INFO " new absolute packet format\n");
|
||||
if (SYN_MODEL_PEN(priv->model_id))
|
||||
printk(KERN_INFO " pen detection\n");
|
||||
|
||||
if (SYN_CAP_EXTENDED(priv->capabilities)) {
|
||||
printk(KERN_INFO " Touchpad has extended capability bits\n");
|
||||
if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap))
|
||||
printk(KERN_INFO " -> %d multi-buttons, i.e. besides standard buttons\n",
|
||||
(int)(SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap)));
|
||||
if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
|
||||
printk(KERN_INFO " -> middle button\n");
|
||||
if (SYN_CAP_FOUR_BUTTON(priv->capabilities))
|
||||
printk(KERN_INFO " -> four buttons\n");
|
||||
if (SYN_CAP_MULTIFINGER(priv->capabilities))
|
||||
printk(KERN_INFO " -> multifinger detection\n");
|
||||
if (SYN_CAP_PALMDETECT(priv->capabilities))
|
||||
printk(KERN_INFO " -> palm detection\n");
|
||||
if (SYN_CAP_PASS_THROUGH(priv->capabilities))
|
||||
printk(KERN_INFO " -> pass-through port\n");
|
||||
}
|
||||
}
|
||||
|
||||
static int synaptics_query_hardware(struct psmouse *psmouse)
|
||||
{
|
||||
int retries = 0;
|
||||
|
||||
while ((retries++ < 3) && psmouse_reset(psmouse))
|
||||
printk(KERN_ERR "synaptics reset failed\n");
|
||||
|
||||
if (synaptics_identify(psmouse))
|
||||
return -1;
|
||||
if (synaptics_model_id(psmouse))
|
||||
return -1;
|
||||
if (synaptics_capability(psmouse))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int synaptics_set_mode(struct psmouse *psmouse, int mode)
|
||||
{
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
|
||||
mode |= SYN_BIT_ABSOLUTE_MODE;
|
||||
if (psmouse_rate >= 80)
|
||||
mode |= SYN_BIT_HIGH_RATE;
|
||||
if (SYN_ID_MAJOR(priv->identity) >= 4)
|
||||
mode |= SYN_BIT_DISABLE_GESTURE;
|
||||
if (SYN_CAP_EXTENDED(priv->capabilities))
|
||||
mode |= SYN_BIT_W_MODE;
|
||||
if (synaptics_mode_cmd(psmouse, mode))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* Synaptics pass-through PS/2 port support
|
||||
****************************************************************************/
|
||||
static int synaptics_pt_write(struct serio *serio, unsigned char c)
|
||||
{
|
||||
struct psmouse *parent = serio->parent->private;
|
||||
char rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */
|
||||
|
||||
if (psmouse_sliced_command(parent, c))
|
||||
return -1;
|
||||
if (psmouse_command(parent, &rate_param, PSMOUSE_CMD_SETRATE))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int synaptics_is_pt_packet(unsigned char *buf)
|
||||
{
|
||||
return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4;
|
||||
}
|
||||
|
||||
static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet)
|
||||
{
|
||||
struct psmouse *child = ptport->private;
|
||||
|
||||
if (child && child->state == PSMOUSE_ACTIVATED) {
|
||||
serio_interrupt(ptport, packet[1], 0, NULL);
|
||||
serio_interrupt(ptport, packet[4], 0, NULL);
|
||||
serio_interrupt(ptport, packet[5], 0, NULL);
|
||||
if (child->type >= PSMOUSE_GENPS)
|
||||
serio_interrupt(ptport, packet[2], 0, NULL);
|
||||
} else
|
||||
serio_interrupt(ptport, packet[1], 0, NULL);
|
||||
}
|
||||
|
||||
static void synaptics_pt_activate(struct psmouse *psmouse)
|
||||
{
|
||||
struct psmouse *child = psmouse->serio->child->private;
|
||||
|
||||
/* adjust the touchpad to child's choice of protocol */
|
||||
if (child && child->type >= PSMOUSE_GENPS) {
|
||||
if (synaptics_set_mode(psmouse, SYN_BIT_FOUR_BYTE_CLIENT))
|
||||
printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void synaptics_pt_create(struct psmouse *psmouse)
|
||||
{
|
||||
struct serio *serio;
|
||||
|
||||
serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
|
||||
if (!serio) {
|
||||
printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
|
||||
return;
|
||||
}
|
||||
|
||||
memset(serio, 0, sizeof(struct serio));
|
||||
|
||||
serio->type = SERIO_PS_PSTHRU;
|
||||
strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name));
|
||||
strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name));
|
||||
serio->write = synaptics_pt_write;
|
||||
serio->parent = psmouse->serio;
|
||||
|
||||
psmouse->pt_activate = synaptics_pt_activate;
|
||||
|
||||
psmouse->serio->child = serio;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* Functions to interpret the absolute mode packets
|
||||
****************************************************************************/
|
||||
|
||||
static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data *priv, struct synaptics_hw_state *hw)
|
||||
{
|
||||
memset(hw, 0, sizeof(struct synaptics_hw_state));
|
||||
|
||||
if (SYN_MODEL_NEWABS(priv->model_id)) {
|
||||
hw->x = (((buf[3] & 0x10) << 8) |
|
||||
((buf[1] & 0x0f) << 8) |
|
||||
buf[4]);
|
||||
hw->y = (((buf[3] & 0x20) << 7) |
|
||||
((buf[1] & 0xf0) << 4) |
|
||||
buf[5]);
|
||||
|
||||
hw->z = buf[2];
|
||||
hw->w = (((buf[0] & 0x30) >> 2) |
|
||||
((buf[0] & 0x04) >> 1) |
|
||||
((buf[3] & 0x04) >> 2));
|
||||
|
||||
hw->left = (buf[0] & 0x01) ? 1 : 0;
|
||||
hw->right = (buf[0] & 0x02) ? 1 : 0;
|
||||
|
||||
if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
|
||||
hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
|
||||
|
||||
if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
|
||||
hw->up = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
|
||||
hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
|
||||
}
|
||||
|
||||
if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) &&
|
||||
((buf[0] ^ buf[3]) & 0x02)) {
|
||||
switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) {
|
||||
default:
|
||||
/*
|
||||
* if nExtBtn is greater than 8 it should be
|
||||
* considered invalid and treated as 0
|
||||
*/
|
||||
break;
|
||||
case 8:
|
||||
hw->ext_buttons |= ((buf[5] & 0x08)) ? 0x80 : 0;
|
||||
hw->ext_buttons |= ((buf[4] & 0x08)) ? 0x40 : 0;
|
||||
case 6:
|
||||
hw->ext_buttons |= ((buf[5] & 0x04)) ? 0x20 : 0;
|
||||
hw->ext_buttons |= ((buf[4] & 0x04)) ? 0x10 : 0;
|
||||
case 4:
|
||||
hw->ext_buttons |= ((buf[5] & 0x02)) ? 0x08 : 0;
|
||||
hw->ext_buttons |= ((buf[4] & 0x02)) ? 0x04 : 0;
|
||||
case 2:
|
||||
hw->ext_buttons |= ((buf[5] & 0x01)) ? 0x02 : 0;
|
||||
hw->ext_buttons |= ((buf[4] & 0x01)) ? 0x01 : 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
hw->x = (((buf[1] & 0x1f) << 8) | buf[2]);
|
||||
hw->y = (((buf[4] & 0x1f) << 8) | buf[5]);
|
||||
|
||||
hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F));
|
||||
hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1));
|
||||
|
||||
hw->left = (buf[0] & 0x01) ? 1 : 0;
|
||||
hw->right = (buf[0] & 0x02) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* called for each full received packet from the touchpad
|
||||
*/
|
||||
static void synaptics_process_packet(struct psmouse *psmouse)
|
||||
{
|
||||
struct input_dev *dev = &psmouse->dev;
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
struct synaptics_hw_state hw;
|
||||
int num_fingers;
|
||||
int finger_width;
|
||||
int i;
|
||||
|
||||
synaptics_parse_hw_state(psmouse->packet, priv, &hw);
|
||||
|
||||
if (hw.z > 0) {
|
||||
num_fingers = 1;
|
||||
finger_width = 5;
|
||||
if (SYN_CAP_EXTENDED(priv->capabilities)) {
|
||||
switch (hw.w) {
|
||||
case 0 ... 1:
|
||||
if (SYN_CAP_MULTIFINGER(priv->capabilities))
|
||||
num_fingers = hw.w + 2;
|
||||
break;
|
||||
case 2:
|
||||
if (SYN_MODEL_PEN(priv->model_id))
|
||||
; /* Nothing, treat a pen as a single finger */
|
||||
break;
|
||||
case 4 ... 15:
|
||||
if (SYN_CAP_PALMDETECT(priv->capabilities))
|
||||
finger_width = hw.w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
num_fingers = 0;
|
||||
finger_width = 0;
|
||||
}
|
||||
|
||||
/* Post events
|
||||
* BTN_TOUCH has to be first as mousedev relies on it when doing
|
||||
* absolute -> relative conversion
|
||||
*/
|
||||
if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
|
||||
if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
|
||||
|
||||
if (hw.z > 0) {
|
||||
input_report_abs(dev, ABS_X, hw.x);
|
||||
input_report_abs(dev, ABS_Y, YMAX_NOMINAL + YMIN_NOMINAL - hw.y);
|
||||
}
|
||||
input_report_abs(dev, ABS_PRESSURE, hw.z);
|
||||
|
||||
input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
|
||||
input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
|
||||
input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
|
||||
input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
|
||||
|
||||
input_report_key(dev, BTN_LEFT, hw.left);
|
||||
input_report_key(dev, BTN_RIGHT, hw.right);
|
||||
|
||||
if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
|
||||
input_report_key(dev, BTN_MIDDLE, hw.middle);
|
||||
|
||||
if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
|
||||
input_report_key(dev, BTN_FORWARD, hw.up);
|
||||
input_report_key(dev, BTN_BACK, hw.down);
|
||||
}
|
||||
|
||||
for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
|
||||
input_report_key(dev, BTN_0 + i, hw.ext_buttons & (1 << i));
|
||||
|
||||
input_sync(dev);
|
||||
}
|
||||
|
||||
static int synaptics_validate_byte(unsigned char packet[], int idx, unsigned char pkt_type)
|
||||
{
|
||||
static unsigned char newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
|
||||
static unsigned char newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
|
||||
static unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
|
||||
static unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
|
||||
static unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
|
||||
|
||||
if (idx < 0 || idx > 4)
|
||||
return 0;
|
||||
|
||||
switch (pkt_type) {
|
||||
case SYN_NEWABS:
|
||||
case SYN_NEWABS_RELAXED:
|
||||
return (packet[idx] & newabs_rel_mask[idx]) == newabs_rslt[idx];
|
||||
|
||||
case SYN_NEWABS_STRICT:
|
||||
return (packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
|
||||
|
||||
case SYN_OLDABS:
|
||||
return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "synaptics: unknown packet type %d\n", pkt_type);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
if (!synaptics_validate_byte(psmouse->packet, i, SYN_NEWABS_STRICT)) {
|
||||
printk(KERN_INFO "synaptics: using relaxed packet validation\n");
|
||||
return SYN_NEWABS_RELAXED;
|
||||
}
|
||||
|
||||
return SYN_NEWABS_STRICT;
|
||||
}
|
||||
|
||||
static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &psmouse->dev;
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
|
||||
input_regs(dev, regs);
|
||||
|
||||
if (psmouse->pktcnt >= 6) { /* Full packet received */
|
||||
if (unlikely(priv->pkt_type == SYN_NEWABS))
|
||||
priv->pkt_type = synaptics_detect_pkt_type(psmouse);
|
||||
|
||||
if (SYN_CAP_PASS_THROUGH(priv->capabilities) && synaptics_is_pt_packet(psmouse->packet)) {
|
||||
if (psmouse->serio->child)
|
||||
synaptics_pass_pt_packet(psmouse->serio->child, psmouse->packet);
|
||||
} else
|
||||
synaptics_process_packet(psmouse);
|
||||
|
||||
return PSMOUSE_FULL_PACKET;
|
||||
}
|
||||
|
||||
return synaptics_validate_byte(psmouse->packet, psmouse->pktcnt - 1, priv->pkt_type) ?
|
||||
PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* Driver initialization/cleanup functions
|
||||
****************************************************************************/
|
||||
static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_bit(EV_ABS, dev->evbit);
|
||||
input_set_abs_params(dev, ABS_X, XMIN_NOMINAL, XMAX_NOMINAL, 0, 0);
|
||||
input_set_abs_params(dev, ABS_Y, YMIN_NOMINAL, YMAX_NOMINAL, 0, 0);
|
||||
input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0);
|
||||
set_bit(ABS_TOOL_WIDTH, dev->absbit);
|
||||
|
||||
set_bit(EV_KEY, dev->evbit);
|
||||
set_bit(BTN_TOUCH, dev->keybit);
|
||||
set_bit(BTN_TOOL_FINGER, dev->keybit);
|
||||
set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
|
||||
set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
|
||||
|
||||
set_bit(BTN_LEFT, dev->keybit);
|
||||
set_bit(BTN_RIGHT, dev->keybit);
|
||||
|
||||
if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
|
||||
set_bit(BTN_MIDDLE, dev->keybit);
|
||||
|
||||
if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
|
||||
set_bit(BTN_FORWARD, dev->keybit);
|
||||
set_bit(BTN_BACK, dev->keybit);
|
||||
}
|
||||
|
||||
for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
|
||||
set_bit(BTN_0 + i, dev->keybit);
|
||||
|
||||
clear_bit(EV_REL, dev->evbit);
|
||||
clear_bit(REL_X, dev->relbit);
|
||||
clear_bit(REL_Y, dev->relbit);
|
||||
}
|
||||
|
||||
void synaptics_reset(struct psmouse *psmouse)
|
||||
{
|
||||
/* reset touchpad back to relative mode, gestures enabled */
|
||||
synaptics_mode_cmd(psmouse, 0);
|
||||
}
|
||||
|
||||
static void synaptics_disconnect(struct psmouse *psmouse)
|
||||
{
|
||||
synaptics_reset(psmouse);
|
||||
kfree(psmouse->private);
|
||||
}
|
||||
|
||||
static int synaptics_reconnect(struct psmouse *psmouse)
|
||||
{
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
struct synaptics_data old_priv = *priv;
|
||||
|
||||
if (!synaptics_detect(psmouse))
|
||||
return -1;
|
||||
|
||||
if (synaptics_query_hardware(psmouse)) {
|
||||
printk(KERN_ERR "Unable to query Synaptics hardware.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (old_priv.identity != priv->identity ||
|
||||
old_priv.model_id != priv->model_id ||
|
||||
old_priv.capabilities != priv->capabilities ||
|
||||
old_priv.ext_cap != priv->ext_cap)
|
||||
return -1;
|
||||
|
||||
if (synaptics_set_mode(psmouse, 0)) {
|
||||
printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int synaptics_detect(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[4];
|
||||
|
||||
param[0] = 0;
|
||||
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
|
||||
psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
|
||||
|
||||
return param[1] == 0x47;
|
||||
}
|
||||
|
||||
int synaptics_init(struct psmouse *psmouse)
|
||||
{
|
||||
struct synaptics_data *priv;
|
||||
|
||||
psmouse->private = priv = kmalloc(sizeof(struct synaptics_data), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -1;
|
||||
memset(priv, 0, sizeof(struct synaptics_data));
|
||||
|
||||
if (synaptics_query_hardware(psmouse)) {
|
||||
printk(KERN_ERR "Unable to query Synaptics hardware.\n");
|
||||
goto init_fail;
|
||||
}
|
||||
|
||||
if (synaptics_set_mode(psmouse, 0)) {
|
||||
printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
|
||||
goto init_fail;
|
||||
}
|
||||
|
||||
priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
|
||||
|
||||
if (SYN_CAP_PASS_THROUGH(priv->capabilities))
|
||||
synaptics_pt_create(psmouse);
|
||||
|
||||
print_ident(priv);
|
||||
set_input_params(&psmouse->dev, priv);
|
||||
|
||||
psmouse->protocol_handler = synaptics_process_byte;
|
||||
psmouse->disconnect = synaptics_disconnect;
|
||||
psmouse->reconnect = synaptics_reconnect;
|
||||
|
||||
return 0;
|
||||
|
||||
init_fail:
|
||||
kfree(priv);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
109
extra/linux-2.6.10/drivers/input/mouse/synaptics.h
Normal file
109
extra/linux-2.6.10/drivers/input/mouse/synaptics.h
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Synaptics TouchPad PS/2 mouse driver
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _SYNAPTICS_H
|
||||
#define _SYNAPTICS_H
|
||||
|
||||
extern int synaptics_detect(struct psmouse *psmouse);
|
||||
extern int synaptics_init(struct psmouse *psmouse);
|
||||
extern void synaptics_reset(struct psmouse *psmouse);
|
||||
|
||||
/* synaptics queries */
|
||||
#define SYN_QUE_IDENTIFY 0x00
|
||||
#define SYN_QUE_MODES 0x01
|
||||
#define SYN_QUE_CAPABILITIES 0x02
|
||||
#define SYN_QUE_MODEL 0x03
|
||||
#define SYN_QUE_SERIAL_NUMBER_PREFIX 0x06
|
||||
#define SYN_QUE_SERIAL_NUMBER_SUFFIX 0x07
|
||||
#define SYN_QUE_RESOLUTION 0x08
|
||||
#define SYN_QUE_EXT_CAPAB 0x09
|
||||
|
||||
/* synatics modes */
|
||||
#define SYN_BIT_ABSOLUTE_MODE (1 << 7)
|
||||
#define SYN_BIT_HIGH_RATE (1 << 6)
|
||||
#define SYN_BIT_SLEEP_MODE (1 << 3)
|
||||
#define SYN_BIT_DISABLE_GESTURE (1 << 2)
|
||||
#define SYN_BIT_FOUR_BYTE_CLIENT (1 << 1)
|
||||
#define SYN_BIT_W_MODE (1 << 0)
|
||||
|
||||
/* synaptics model ID bits */
|
||||
#define SYN_MODEL_ROT180(m) ((m) & (1 << 23))
|
||||
#define SYN_MODEL_PORTRAIT(m) ((m) & (1 << 22))
|
||||
#define SYN_MODEL_SENSOR(m) (((m) >> 16) & 0x3f)
|
||||
#define SYN_MODEL_HARDWARE(m) (((m) >> 9) & 0x7f)
|
||||
#define SYN_MODEL_NEWABS(m) ((m) & (1 << 7))
|
||||
#define SYN_MODEL_PEN(m) ((m) & (1 << 6))
|
||||
#define SYN_MODEL_SIMPLIC(m) ((m) & (1 << 5))
|
||||
#define SYN_MODEL_GEOMETRY(m) ((m) & 0x0f)
|
||||
|
||||
/* synaptics capability bits */
|
||||
#define SYN_CAP_EXTENDED(c) ((c) & (1 << 23))
|
||||
#define SYN_CAP_MIDDLE_BUTTON(c) ((c) & (1 << 18))
|
||||
#define SYN_CAP_PASS_THROUGH(c) ((c) & (1 << 7))
|
||||
#define SYN_CAP_SLEEP(c) ((c) & (1 << 4))
|
||||
#define SYN_CAP_FOUR_BUTTON(c) ((c) & (1 << 3))
|
||||
#define SYN_CAP_MULTIFINGER(c) ((c) & (1 << 1))
|
||||
#define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0))
|
||||
#define SYN_CAP_VALID(c) ((((c) & 0x00ff00) >> 8) == 0x47)
|
||||
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||
|
||||
/* synaptics modes query bits */
|
||||
#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
|
||||
#define SYN_MODE_RATE(m) ((m) & (1 << 6))
|
||||
#define SYN_MODE_BAUD_SLEEP(m) ((m) & (1 << 3))
|
||||
#define SYN_MODE_DISABLE_GESTURE(m) ((m) & (1 << 2))
|
||||
#define SYN_MODE_PACKSIZE(m) ((m) & (1 << 1))
|
||||
#define SYN_MODE_WMODE(m) ((m) & (1 << 0))
|
||||
|
||||
/* synaptics identify query bits */
|
||||
#define SYN_ID_MODEL(i) (((i) >> 4) & 0x0f)
|
||||
#define SYN_ID_MAJOR(i) ((i) & 0x0f)
|
||||
#define SYN_ID_MINOR(i) (((i) >> 16) & 0xff)
|
||||
#define SYN_ID_IS_SYNAPTICS(i) ((((i) >> 8) & 0xff) == 0x47)
|
||||
|
||||
/* synaptics special commands */
|
||||
#define SYN_PS_SET_MODE2 0x14
|
||||
#define SYN_PS_CLIENT_CMD 0x28
|
||||
|
||||
/* synaptics packet types */
|
||||
#define SYN_NEWABS 0
|
||||
#define SYN_NEWABS_STRICT 1
|
||||
#define SYN_NEWABS_RELAXED 2
|
||||
#define SYN_OLDABS 3
|
||||
|
||||
/*
|
||||
* A structure to describe the state of the touchpad hardware (buttons and pad)
|
||||
*/
|
||||
|
||||
struct synaptics_hw_state {
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
int w;
|
||||
unsigned int left:1;
|
||||
unsigned int right:1;
|
||||
unsigned int middle:1;
|
||||
unsigned int up:1;
|
||||
unsigned int down:1;
|
||||
unsigned char ext_buttons;
|
||||
};
|
||||
|
||||
struct synaptics_data {
|
||||
/* Data read from the touchpad */
|
||||
unsigned long int model_id; /* Model-ID */
|
||||
unsigned long int capabilities; /* Capabilities */
|
||||
unsigned long int ext_cap; /* Extended Capabilities */
|
||||
unsigned long int identity; /* Identification */
|
||||
|
||||
/* Data for normal processing */
|
||||
int old_w; /* Previous w value */
|
||||
unsigned char pkt_type; /* packet type - old, new, etc */
|
||||
};
|
||||
|
||||
#endif /* _SYNAPTICS_H */
|
||||
BIN
extra/linux-2.6.10/drivers/input/mouse/synaptics.o
Normal file
BIN
extra/linux-2.6.10/drivers/input/mouse/synaptics.o
Normal file
Binary file not shown.
570
extra/linux-2.6.10/drivers/input/mouse/vsxxxaa.c
Normal file
570
extra/linux-2.6.10/drivers/input/mouse/vsxxxaa.c
Normal file
@@ -0,0 +1,570 @@
|
||||
/*
|
||||
* DEC VSXXX-AA and VSXXX-GA mouse driver.
|
||||
*
|
||||
* Copyright (C) 2003-2004 by Jan-Benedict Glaw <jbglaw@lug-owl.de>
|
||||
*
|
||||
* The packet format was taken from a patch to GPM which is (C) 2001
|
||||
* by Karsten Merker <merker@linuxtag.org>
|
||||
* and Maciej W. Rozycki <macro@ds2.pg.gda.pl>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Building an adaptor to DB9 / DB25 RS232
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* DISCLAIMER: Use this description AT YOUR OWN RISK! I'll not pay for
|
||||
* anything if you break your mouse, your computer or whatever!
|
||||
*
|
||||
* In theory, this mouse is a simple RS232 device. In practice, it has got
|
||||
* a quite uncommon plug and the requirement to additionally get a power
|
||||
* supply at +5V and -12V.
|
||||
*
|
||||
* If you look at the socket/jack (_not_ at the plug), we use this pin
|
||||
* numbering:
|
||||
* _______
|
||||
* / 7 6 5 \
|
||||
* | 4 --- 3 |
|
||||
* \ 2 1 /
|
||||
* -------
|
||||
*
|
||||
* DEC socket DB9 DB25 Note
|
||||
* 1 (GND) 5 7 -
|
||||
* 2 (RxD) 2 3 -
|
||||
* 3 (TxD) 3 2 -
|
||||
* 4 (-12V) - - Somewhere from the PSU. At ATX, it's
|
||||
* the thin blue wire at pin 12 of the
|
||||
* ATX power connector. Only required for
|
||||
* VSXXX-AA/-GA mice.
|
||||
* 5 (+5V) - - PSU (red wires of ATX power connector
|
||||
* on pin 4, 6, 19 or 20) or HDD power
|
||||
* connector (also red wire).
|
||||
* 6 (+12V) - - HDD power connector, yellow wire. Only
|
||||
* required for VSXXX-AB digitizer.
|
||||
* 7 (dev. avail.) - - The mouse shorts this one to pin 1.
|
||||
* This way, the host computer can detect
|
||||
* the mouse. To use it with the adaptor,
|
||||
* simply don't connect this pin.
|
||||
*
|
||||
* So to get a working adaptor, you need to connect the mouse with three
|
||||
* wires to a RS232 port and two or three additional wires for +5V, +12V and
|
||||
* -12V to the PSU.
|
||||
*
|
||||
* Flow specification for the link is 4800, 8o1.
|
||||
*
|
||||
* The mice and tablet are described in "VCB02 Video Subsystem - Technical
|
||||
* Manual", DEC EK-104AA-TM-001. You'll find it at MANX, a search engine
|
||||
* specific for DEC documentation. Try
|
||||
* http://www.vt100.net/manx/details?pn=EK-104AA-TM-001;id=21;cp=1
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/serio.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#define DRIVER_DESC "Serial DEC VSXXX-AA/GA mouse / DEC tablet driver"
|
||||
|
||||
MODULE_AUTHOR ("Jan-Benedict Glaw <jbglaw@lug-owl.de>");
|
||||
MODULE_DESCRIPTION (DRIVER_DESC);
|
||||
MODULE_LICENSE ("GPL");
|
||||
|
||||
#undef VSXXXAA_DEBUG
|
||||
#ifdef VSXXXAA_DEBUG
|
||||
#define DBG(x...) printk (x)
|
||||
#else
|
||||
#define DBG(x...) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define VSXXXAA_INTRO_MASK 0x80
|
||||
#define VSXXXAA_INTRO_HEAD 0x80
|
||||
#define IS_HDR_BYTE(x) (((x) & VSXXXAA_INTRO_MASK) \
|
||||
== VSXXXAA_INTRO_HEAD)
|
||||
|
||||
#define VSXXXAA_PACKET_MASK 0xe0
|
||||
#define VSXXXAA_PACKET_REL 0x80
|
||||
#define VSXXXAA_PACKET_ABS 0xc0
|
||||
#define VSXXXAA_PACKET_POR 0xa0
|
||||
#define MATCH_PACKET_TYPE(data, type) (((data) & VSXXXAA_PACKET_MASK) == type)
|
||||
|
||||
|
||||
|
||||
struct vsxxxaa {
|
||||
struct input_dev dev;
|
||||
struct serio *serio;
|
||||
#define BUFLEN 15 /* At least 5 is needed for a full tablet packet */
|
||||
unsigned char buf[BUFLEN];
|
||||
unsigned char count;
|
||||
unsigned char version;
|
||||
unsigned char country;
|
||||
unsigned char type;
|
||||
char name[64];
|
||||
char phys[32];
|
||||
};
|
||||
|
||||
static void
|
||||
vsxxxaa_drop_bytes (struct vsxxxaa *mouse, int num)
|
||||
{
|
||||
if (num >= mouse->count)
|
||||
mouse->count = 0;
|
||||
else {
|
||||
memmove (mouse->buf, mouse->buf + num - 1, BUFLEN - num);
|
||||
mouse->count -= num;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_queue_byte (struct vsxxxaa *mouse, unsigned char byte)
|
||||
{
|
||||
if (mouse->count == BUFLEN) {
|
||||
printk (KERN_ERR "%s on %s: Dropping a byte of full buffer.\n",
|
||||
mouse->name, mouse->phys);
|
||||
vsxxxaa_drop_bytes (mouse, 1);
|
||||
}
|
||||
DBG (KERN_INFO "Queueing byte 0x%02x\n", byte);
|
||||
|
||||
mouse->buf[mouse->count++] = byte;
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_detection_done (struct vsxxxaa *mouse)
|
||||
{
|
||||
switch (mouse->type) {
|
||||
case 0x02:
|
||||
sprintf (mouse->name, "DEC VSXXX-AA/GA mouse");
|
||||
break;
|
||||
|
||||
case 0x04:
|
||||
sprintf (mouse->name, "DEC VSXXX-AB digitizer");
|
||||
break;
|
||||
|
||||
default:
|
||||
sprintf (mouse->name, "unknown DEC pointer device");
|
||||
break;
|
||||
}
|
||||
|
||||
printk (KERN_INFO "Found %s version 0x%02x from country 0x%02x "
|
||||
"on port %s\n", mouse->name, mouse->version,
|
||||
mouse->country, mouse->phys);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns number of bytes to be dropped, 0 if packet is okay.
|
||||
*/
|
||||
static int
|
||||
vsxxxaa_check_packet (struct vsxxxaa *mouse, int packet_len)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* First byte must be a header byte */
|
||||
if (!IS_HDR_BYTE (mouse->buf[0])) {
|
||||
DBG ("vsck: len=%d, 1st=0x%02x\n", packet_len, mouse->buf[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Check all following bytes */
|
||||
if (packet_len > 1) {
|
||||
for (i = 1; i < packet_len; i++) {
|
||||
if (IS_HDR_BYTE (mouse->buf[i])) {
|
||||
printk (KERN_ERR "Need to drop %d bytes "
|
||||
"of a broken packet.\n",
|
||||
i - 1);
|
||||
DBG (KERN_INFO "check: len=%d, b[%d]=0x%02x\n",
|
||||
packet_len, i, mouse->buf[i]);
|
||||
return i - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __inline__ int
|
||||
vsxxxaa_smells_like_packet (struct vsxxxaa *mouse, unsigned char type, size_t len)
|
||||
{
|
||||
return (mouse->count >= len) && MATCH_PACKET_TYPE (mouse->buf[0], type);
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_handle_REL_packet (struct vsxxxaa *mouse, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &mouse->dev;
|
||||
unsigned char *buf = mouse->buf;
|
||||
int left, middle, right;
|
||||
int dx, dy;
|
||||
|
||||
/*
|
||||
* Check for normal stream packets. This is three bytes,
|
||||
* with the first byte's 3 MSB set to 100.
|
||||
*
|
||||
* [0]: 1 0 0 SignX SignY Left Middle Right
|
||||
* [1]: 0 dx dx dx dx dx dx dx
|
||||
* [2]: 0 dy dy dy dy dy dy dy
|
||||
*/
|
||||
|
||||
/*
|
||||
* Low 7 bit of byte 1 are abs(dx), bit 7 is
|
||||
* 0, bit 4 of byte 0 is direction.
|
||||
*/
|
||||
dx = buf[1] & 0x7f;
|
||||
dx *= ((buf[0] >> 4) & 0x01)? 1: -1;
|
||||
|
||||
/*
|
||||
* Low 7 bit of byte 2 are abs(dy), bit 7 is
|
||||
* 0, bit 3 of byte 0 is direction.
|
||||
*/
|
||||
dy = buf[2] & 0x7f;
|
||||
dy *= ((buf[0] >> 3) & 0x01)? -1: 1;
|
||||
|
||||
/*
|
||||
* Get button state. It's the low three bits
|
||||
* (for three buttons) of byte 0.
|
||||
*/
|
||||
left = (buf[0] & 0x04)? 1: 0;
|
||||
middle = (buf[0] & 0x02)? 1: 0;
|
||||
right = (buf[0] & 0x01)? 1: 0;
|
||||
|
||||
vsxxxaa_drop_bytes (mouse, 3);
|
||||
|
||||
DBG (KERN_INFO "%s on %s: dx=%d, dy=%d, buttons=%s%s%s\n",
|
||||
mouse->name, mouse->phys, dx, dy,
|
||||
left? "L": "l", middle? "M": "m", right? "R": "r");
|
||||
|
||||
/*
|
||||
* Report what we've found so far...
|
||||
*/
|
||||
input_regs (dev, regs);
|
||||
input_report_key (dev, BTN_LEFT, left);
|
||||
input_report_key (dev, BTN_MIDDLE, middle);
|
||||
input_report_key (dev, BTN_RIGHT, right);
|
||||
input_report_key (dev, BTN_TOUCH, 0);
|
||||
input_report_rel (dev, REL_X, dx);
|
||||
input_report_rel (dev, REL_Y, dy);
|
||||
input_sync (dev);
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_handle_ABS_packet (struct vsxxxaa *mouse, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &mouse->dev;
|
||||
unsigned char *buf = mouse->buf;
|
||||
int left, middle, right, touch;
|
||||
int x, y;
|
||||
|
||||
/*
|
||||
* Tablet position / button packet
|
||||
*
|
||||
* [0]: 1 1 0 B4 B3 B2 B1 Pr
|
||||
* [1]: 0 0 X5 X4 X3 X2 X1 X0
|
||||
* [2]: 0 0 X11 X10 X9 X8 X7 X6
|
||||
* [3]: 0 0 Y5 Y4 Y3 Y2 Y1 Y0
|
||||
* [4]: 0 0 Y11 Y10 Y9 Y8 Y7 Y6
|
||||
*/
|
||||
|
||||
/*
|
||||
* Get X/Y position. Y axis needs to be inverted since VSXXX-AB
|
||||
* counts down->top while monitor counts top->bottom.
|
||||
*/
|
||||
x = ((buf[2] & 0x3f) << 6) | (buf[1] & 0x3f);
|
||||
y = ((buf[4] & 0x3f) << 6) | (buf[3] & 0x3f);
|
||||
y = 1023 - y;
|
||||
|
||||
/*
|
||||
* Get button state. It's bits <4..1> of byte 0.
|
||||
*/
|
||||
left = (buf[0] & 0x02)? 1: 0;
|
||||
middle = (buf[0] & 0x04)? 1: 0;
|
||||
right = (buf[0] & 0x08)? 1: 0;
|
||||
touch = (buf[0] & 0x10)? 1: 0;
|
||||
|
||||
vsxxxaa_drop_bytes (mouse, 5);
|
||||
|
||||
DBG (KERN_INFO "%s on %s: x=%d, y=%d, buttons=%s%s%s%s\n",
|
||||
mouse->name, mouse->phys, x, y,
|
||||
left? "L": "l", middle? "M": "m",
|
||||
right? "R": "r", touch? "T": "t");
|
||||
|
||||
/*
|
||||
* Report what we've found so far...
|
||||
*/
|
||||
input_regs (dev, regs);
|
||||
input_report_key (dev, BTN_LEFT, left);
|
||||
input_report_key (dev, BTN_MIDDLE, middle);
|
||||
input_report_key (dev, BTN_RIGHT, right);
|
||||
input_report_key (dev, BTN_TOUCH, touch);
|
||||
input_report_abs (dev, ABS_X, x);
|
||||
input_report_abs (dev, ABS_Y, y);
|
||||
input_sync (dev);
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_handle_POR_packet (struct vsxxxaa *mouse, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &mouse->dev;
|
||||
unsigned char *buf = mouse->buf;
|
||||
int left, middle, right;
|
||||
unsigned char error;
|
||||
|
||||
/*
|
||||
* Check for Power-On-Reset packets. These are sent out
|
||||
* after plugging the mouse in, or when explicitely
|
||||
* requested by sending 'T'.
|
||||
*
|
||||
* [0]: 1 0 1 0 R3 R2 R1 R0
|
||||
* [1]: 0 M2 M1 M0 D3 D2 D1 D0
|
||||
* [2]: 0 E6 E5 E4 E3 E2 E1 E0
|
||||
* [3]: 0 0 0 0 0 Left Middle Right
|
||||
*
|
||||
* M: manufacturer location code
|
||||
* R: revision code
|
||||
* E: Error code. I'm not sure about these, but gpm's sources,
|
||||
* which support this mouse, too, tell about them:
|
||||
* E = [0x00 .. 0x1f]: no error, byte #3 is button state
|
||||
* E = 0x3d: button error, byte #3 tells which one.
|
||||
* E = <else>: other error
|
||||
* D: <0010> == mouse, <0100> == tablet
|
||||
*
|
||||
*/
|
||||
|
||||
mouse->version = buf[0] & 0x0f;
|
||||
mouse->country = (buf[1] >> 4) & 0x07;
|
||||
mouse->type = buf[1] & 0x0f;
|
||||
error = buf[2] & 0x7f;
|
||||
|
||||
/*
|
||||
* Get button state. It's the low three bits
|
||||
* (for three buttons) of byte 0. Maybe even the bit <3>
|
||||
* has some meaning if a tablet is attached.
|
||||
*/
|
||||
left = (buf[0] & 0x04)? 1: 0;
|
||||
middle = (buf[0] & 0x02)? 1: 0;
|
||||
right = (buf[0] & 0x01)? 1: 0;
|
||||
|
||||
vsxxxaa_drop_bytes (mouse, 4);
|
||||
vsxxxaa_detection_done (mouse);
|
||||
|
||||
if (error <= 0x1f) {
|
||||
/* No error. Report buttons */
|
||||
input_regs (dev, regs);
|
||||
input_report_key (dev, BTN_LEFT, left);
|
||||
input_report_key (dev, BTN_MIDDLE, middle);
|
||||
input_report_key (dev, BTN_RIGHT, right);
|
||||
input_report_key (dev, BTN_TOUCH, 0);
|
||||
input_sync (dev);
|
||||
} else {
|
||||
printk (KERN_ERR "Your %s on %s reports an undefined error, "
|
||||
"please check it...\n", mouse->name,
|
||||
mouse->phys);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the mouse was hot-plugged, we need to force differential mode
|
||||
* now... However, give it a second to recover from it's reset.
|
||||
*/
|
||||
printk (KERN_NOTICE "%s on %s: Forceing standard packet format and "
|
||||
"streaming mode\n", mouse->name, mouse->phys);
|
||||
mouse->serio->write (mouse->serio, 'S');
|
||||
mdelay (50);
|
||||
mouse->serio->write (mouse->serio, 'R');
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_parse_buffer (struct vsxxxaa *mouse, struct pt_regs *regs)
|
||||
{
|
||||
unsigned char *buf = mouse->buf;
|
||||
int stray_bytes;
|
||||
|
||||
/*
|
||||
* Parse buffer to death...
|
||||
*/
|
||||
do {
|
||||
/*
|
||||
* Out of sync? Throw away what we don't understand. Each
|
||||
* packet starts with a byte whose bit 7 is set. Unhandled
|
||||
* packets (ie. which we don't know about or simply b0rk3d
|
||||
* data...) will get shifted out of the buffer after some
|
||||
* activity on the mouse.
|
||||
*/
|
||||
while (mouse->count > 0 && !IS_HDR_BYTE(buf[0])) {
|
||||
printk (KERN_ERR "%s on %s: Dropping a byte to regain "
|
||||
"sync with mouse data stream...\n",
|
||||
mouse->name, mouse->phys);
|
||||
vsxxxaa_drop_bytes (mouse, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for packets we know about.
|
||||
*/
|
||||
|
||||
if (vsxxxaa_smells_like_packet (mouse, VSXXXAA_PACKET_REL, 3)) {
|
||||
/* Check for broken packet */
|
||||
stray_bytes = vsxxxaa_check_packet (mouse, 3);
|
||||
if (stray_bytes > 0) {
|
||||
printk (KERN_ERR "Dropping %d bytes now...\n",
|
||||
stray_bytes);
|
||||
vsxxxaa_drop_bytes (mouse, stray_bytes);
|
||||
continue;
|
||||
}
|
||||
|
||||
vsxxxaa_handle_REL_packet (mouse, regs);
|
||||
continue; /* More to parse? */
|
||||
}
|
||||
|
||||
if (vsxxxaa_smells_like_packet (mouse, VSXXXAA_PACKET_ABS, 5)) {
|
||||
/* Check for broken packet */
|
||||
stray_bytes = vsxxxaa_check_packet (mouse, 5);
|
||||
if (stray_bytes > 0) {
|
||||
printk (KERN_ERR "Dropping %d bytes now...\n",
|
||||
stray_bytes);
|
||||
vsxxxaa_drop_bytes (mouse, stray_bytes);
|
||||
continue;
|
||||
}
|
||||
|
||||
vsxxxaa_handle_ABS_packet (mouse, regs);
|
||||
continue; /* More to parse? */
|
||||
}
|
||||
|
||||
if (vsxxxaa_smells_like_packet (mouse, VSXXXAA_PACKET_POR, 4)) {
|
||||
/* Check for broken packet */
|
||||
stray_bytes = vsxxxaa_check_packet (mouse, 4);
|
||||
if (stray_bytes > 0) {
|
||||
printk (KERN_ERR "Dropping %d bytes now...\n",
|
||||
stray_bytes);
|
||||
vsxxxaa_drop_bytes (mouse, stray_bytes);
|
||||
continue;
|
||||
}
|
||||
|
||||
vsxxxaa_handle_POR_packet (mouse, regs);
|
||||
continue; /* More to parse? */
|
||||
}
|
||||
|
||||
break; /* No REL, ABS or POR packet found */
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
vsxxxaa_interrupt (struct serio *serio, unsigned char data, unsigned int flags,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
struct vsxxxaa *mouse = serio->private;
|
||||
|
||||
vsxxxaa_queue_byte (mouse, data);
|
||||
vsxxxaa_parse_buffer (mouse, regs);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_disconnect (struct serio *serio)
|
||||
{
|
||||
struct vsxxxaa *mouse = serio->private;
|
||||
|
||||
input_unregister_device (&mouse->dev);
|
||||
serio_close (serio);
|
||||
kfree (mouse);
|
||||
}
|
||||
|
||||
static void
|
||||
vsxxxaa_connect (struct serio *serio, struct serio_driver *drv)
|
||||
{
|
||||
struct vsxxxaa *mouse;
|
||||
|
||||
if ((serio->type & SERIO_TYPE) != SERIO_RS232)
|
||||
return;
|
||||
if ((serio->type & SERIO_PROTO) != SERIO_VSXXXAA)
|
||||
return;
|
||||
|
||||
if (!(mouse = kmalloc (sizeof (struct vsxxxaa), GFP_KERNEL)))
|
||||
return;
|
||||
|
||||
memset (mouse, 0, sizeof (struct vsxxxaa));
|
||||
|
||||
init_input_dev (&mouse->dev);
|
||||
set_bit (EV_KEY, mouse->dev.evbit); /* We have buttons */
|
||||
set_bit (EV_REL, mouse->dev.evbit);
|
||||
set_bit (EV_ABS, mouse->dev.evbit);
|
||||
set_bit (BTN_LEFT, mouse->dev.keybit); /* We have 3 buttons */
|
||||
set_bit (BTN_MIDDLE, mouse->dev.keybit);
|
||||
set_bit (BTN_RIGHT, mouse->dev.keybit);
|
||||
set_bit (BTN_TOUCH, mouse->dev.keybit); /* ...and Tablet */
|
||||
set_bit (REL_X, mouse->dev.relbit);
|
||||
set_bit (REL_Y, mouse->dev.relbit);
|
||||
set_bit (ABS_X, mouse->dev.absbit);
|
||||
set_bit (ABS_Y, mouse->dev.absbit);
|
||||
|
||||
mouse->dev.absmin[ABS_X] = 0;
|
||||
mouse->dev.absmax[ABS_X] = 1023;
|
||||
mouse->dev.absmin[ABS_Y] = 0;
|
||||
mouse->dev.absmax[ABS_Y] = 1023;
|
||||
|
||||
mouse->dev.private = mouse;
|
||||
serio->private = mouse;
|
||||
|
||||
sprintf (mouse->name, "DEC VSXXX-AA/GA mouse or VSXXX-AB digitizer");
|
||||
sprintf (mouse->phys, "%s/input0", serio->phys);
|
||||
mouse->dev.name = mouse->name;
|
||||
mouse->dev.phys = mouse->phys;
|
||||
mouse->dev.id.bustype = BUS_RS232;
|
||||
mouse->serio = serio;
|
||||
|
||||
if (serio_open (serio, drv)) {
|
||||
kfree (mouse);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Request selftest. Standard packet format and differential
|
||||
* mode will be requested after the device ID'ed successfully.
|
||||
*/
|
||||
mouse->serio->write (mouse->serio, 'T'); /* Test */
|
||||
|
||||
input_register_device (&mouse->dev);
|
||||
|
||||
printk (KERN_INFO "input: %s on %s\n", mouse->name, mouse->phys);
|
||||
}
|
||||
|
||||
static struct serio_driver vsxxxaa_drv = {
|
||||
.driver = {
|
||||
.name = "vsxxxaa",
|
||||
},
|
||||
.description = DRIVER_DESC,
|
||||
.connect = vsxxxaa_connect,
|
||||
.interrupt = vsxxxaa_interrupt,
|
||||
.disconnect = vsxxxaa_disconnect,
|
||||
};
|
||||
|
||||
int __init
|
||||
vsxxxaa_init (void)
|
||||
{
|
||||
serio_register_driver(&vsxxxaa_drv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __exit
|
||||
vsxxxaa_exit (void)
|
||||
{
|
||||
serio_unregister_driver(&vsxxxaa_drv);
|
||||
}
|
||||
|
||||
module_init (vsxxxaa_init);
|
||||
module_exit (vsxxxaa_exit);
|
||||
|
||||
Reference in New Issue
Block a user