mirror of
git://projects.qi-hardware.com/nn-usb-fpga.git
synced 2025-04-21 12:27:27 +03:00
Adding PS2, capacitive keyboard examples
This commit is contained in:
28
PS2_INTERFACE/drivers/Makefile
Executable file
28
PS2_INTERFACE/drivers/Makefile
Executable file
@@ -0,0 +1,28 @@
|
||||
EXTRA_CFLAGS += -Wall
|
||||
OPENWRT_BASE = /home/ari/sie/p/openwrt-xburst
|
||||
KERNEL_SRC = $(OPENWRT_BASE)/build_dir/linux-xburst_qi_lb60/linux-2.6.32.16/
|
||||
CC = $(OPENWRT_BASE)/staging_dir/toolchain-mipsel_gcc-4.3.3+cs_uClibc-0.9.32/usr/bin/mipsel-openwrt-linux-gcc
|
||||
CROSS_COMPILE = $(OPENWRT_BASE)/staging_dir/toolchain-mipsel_gcc-4.3.3+cs_uClibc-0.9.32/usr/bin/mipsel-openwrt-linux-
|
||||
NANO_IP = 192.168.254.101
|
||||
|
||||
obj-m += ps2_kb.o ps2_ms.o#hello.o memory.o digTest.o
|
||||
all: driver #main
|
||||
|
||||
driver:
|
||||
make -C $(KERNEL_SRC) M=$(PWD) ARCH=mips CROSS_COMPILE=$(CROSS_COMPILE) modules
|
||||
clean:
|
||||
make -C $(KERNEL_SRC) M=$(PWD) ARCH=mips CROSS_COMPILE=$(CROSS_COMPILE) clean
|
||||
rm -f *.o Modules.symvers
|
||||
|
||||
cleanall:
|
||||
make -C $(KERNEL_SRC) M=$(PWD) ARCH=mips CROSS_COMPILE=$(CROSS_COMPILE) clean
|
||||
rm -f *.o *.c~ Makefile~ main.o main Modules.symvers
|
||||
|
||||
upload: all
|
||||
scp ps2_ms.ko root@$(NANO_IP):~/
|
||||
|
||||
main: main.o
|
||||
|
||||
PREPROCESS.c = $(CC) $(CFLAGS) $(TARGET_ARCH) -E -Wp,-C,-dD,-dI
|
||||
%.pp : %.c FORCE
|
||||
$(PREPROCESS.c) $< > $@
|
||||
18
PS2_INTERFACE/drivers/hello.c
Executable file
18
PS2_INTERFACE/drivers/hello.c
Executable file
@@ -0,0 +1,18 @@
|
||||
/* Necessary includes for drivers */
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h> /* printk() */
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int hello_init(void) {
|
||||
printk("Hello world!. init\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hello_exit(void) {
|
||||
printk("Bye, cruel world. exit\n");
|
||||
}
|
||||
|
||||
module_init(hello_init);
|
||||
module_exit(hello_exit)
|
||||
110
PS2_INTERFACE/drivers/hpps2atkbd.h
Executable file
110
PS2_INTERFACE/drivers/hpps2atkbd.h
Executable file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* drivers/input/keyboard/hpps2atkbd.h
|
||||
*
|
||||
* Copyright (c) 2004 Helge Deller <deller@gmx.de>
|
||||
* Copyright (c) 2002 Laurent Canet <canetl@esiee.fr>
|
||||
* Copyright (c) 2002 Thibaut Varene <varenet@parisc-linux.org>
|
||||
* Copyright (c) 2000 Xavier Debacker <debackex@esiee.fr>
|
||||
*
|
||||
* HP PS/2 AT-compatible Keyboard, found in PA/RISC Workstations & Laptops
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
|
||||
/* Is the keyboard an RDI PrecisionBook? */
|
||||
#ifndef CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES
|
||||
# define CONFLICT(x,y) x
|
||||
#else
|
||||
# define CONFLICT(x,y) y
|
||||
#endif
|
||||
|
||||
/* sadly RDI (Tadpole) decided to ship a different keyboard layout
|
||||
than HP for their PS/2 laptop keyboard which leads to conflicting
|
||||
keycodes between a normal HP PS/2 keyboard and a RDI Precisionbook.
|
||||
HP: RDI: */
|
||||
#define C_07 CONFLICT( KEY_F12, KEY_F1 )
|
||||
#define C_11 CONFLICT( KEY_LEFTALT, KEY_LEFTCTRL )
|
||||
#define C_14 CONFLICT( KEY_LEFTCTRL, KEY_CAPSLOCK )
|
||||
#define C_58 CONFLICT( KEY_CAPSLOCK, KEY_RIGHTCTRL )
|
||||
#define C_61 CONFLICT( KEY_102ND, KEY_LEFT )
|
||||
|
||||
/* Raw SET 2 scancode table */
|
||||
|
||||
/* 00 */ KEY_RESERVED, KEY_F9, KEY_RESERVED, KEY_F5, KEY_F3, KEY_F1, KEY_F2, C_07,
|
||||
/* 08 */ KEY_ESC, KEY_F10, KEY_F8, KEY_F6, KEY_F4, KEY_TAB, KEY_GRAVE, KEY_F2,
|
||||
/* 10 */ KEY_RESERVED, C_11, KEY_LEFTSHIFT, KEY_RESERVED, C_14, KEY_Q, KEY_1, KEY_F3,
|
||||
/* 18 */ KEY_RESERVED, KEY_LEFTALT, KEY_Z, KEY_S, KEY_A, KEY_W, KEY_2, KEY_F4,
|
||||
/* 20 */ KEY_RESERVED, KEY_C, KEY_X, KEY_D, KEY_E, KEY_4, KEY_3, KEY_F5,
|
||||
/* 28 */ KEY_RESERVED, KEY_SPACE, KEY_V, KEY_F, KEY_T, KEY_R, KEY_5, KEY_F6,
|
||||
/* 30 */ KEY_RESERVED, KEY_N, KEY_B, KEY_H, KEY_G, KEY_Y, KEY_6, KEY_F7,
|
||||
/* 38 */ KEY_RESERVED, KEY_RIGHTALT, KEY_M, KEY_J, KEY_U, KEY_7, KEY_8, KEY_F8,
|
||||
/* 40 */ KEY_RESERVED, KEY_COMMA, KEY_K, KEY_I, KEY_O, KEY_0, KEY_9, KEY_F9,
|
||||
/* 48 */ KEY_RESERVED, KEY_DOT, KEY_SLASH, KEY_L, KEY_SEMICOLON, KEY_P, KEY_MINUS, KEY_F10,
|
||||
/* 50 */ KEY_RESERVED, KEY_RESERVED, KEY_APOSTROPHE,KEY_RESERVED, KEY_LEFTBRACE, KEY_EQUAL, KEY_F11, KEY_SYSRQ,
|
||||
/* 58 */ C_58, KEY_RIGHTSHIFT,KEY_ENTER, KEY_RIGHTBRACE,KEY_BACKSLASH, KEY_BACKSLASH,KEY_F12, KEY_SCROLLLOCK,
|
||||
/* 60 */ KEY_DOWN, C_61, KEY_PAUSE, KEY_UP, KEY_DELETE, KEY_END, KEY_BACKSPACE, KEY_INSERT,
|
||||
/* 68 */ KEY_RESERVED, KEY_KP1, KEY_RIGHT, KEY_KP4, KEY_KP7, KEY_PAGEDOWN, KEY_HOME, KEY_PAGEUP,
|
||||
/* 70 */ KEY_KP0, KEY_KPDOT, KEY_KP2, KEY_KP5, KEY_KP6, KEY_KP8, KEY_ESC, KEY_NUMLOCK,
|
||||
/* 78 */ KEY_F11, KEY_KPPLUS, KEY_KP3, KEY_KPMINUS, KEY_KPASTERISK,KEY_KP9, KEY_SCROLLLOCK,KEY_102ND,
|
||||
/* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 90 */ KEY_RESERVED, KEY_RIGHTALT, 255, KEY_RESERVED, KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_CAPSLOCK, KEY_RESERVED, KEY_LEFTMETA,
|
||||
/* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RIGHTMETA,
|
||||
/* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_COMPOSE,
|
||||
/* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_KPSLASH, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_KPENTER, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* e8 */ KEY_RESERVED, KEY_END, KEY_RESERVED, KEY_LEFT, KEY_HOME, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* f0 */ KEY_INSERT, KEY_DELETE, KEY_DOWN, KEY_RESERVED, KEY_RIGHT, KEY_UP, KEY_RESERVED, KEY_PAUSE,
|
||||
/* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_PAGEDOWN, KEY_RESERVED, KEY_SYSRQ, KEY_PAGEUP, KEY_RESERVED, KEY_RESERVED,
|
||||
|
||||
/* These are offset for escaped keycodes: */
|
||||
|
||||
/* 00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_F7, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 08 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_LEFTMETA, KEY_RIGHTMETA, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 10 */ KEY_RESERVED, KEY_RIGHTALT, KEY_RESERVED, KEY_RESERVED, KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 18 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 20 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 28 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 30 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 38 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 40 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 48 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 50 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 58 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 60 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 68 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 70 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 78 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 90 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* e8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* f0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
|
||||
/* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
|
||||
|
||||
#undef CONFLICT
|
||||
#undef C_07
|
||||
#undef C_11
|
||||
#undef C_14
|
||||
#undef C_58
|
||||
#undef C_61
|
||||
|
||||
162
PS2_INTERFACE/drivers/kbps2.c
Executable file
162
PS2_INTERFACE/drivers/kbps2.c
Executable file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* Driver preliminar y de pruebas de teclado ps2 kbps2
|
||||
*
|
||||
* Author: Ari Andrés Bejarano H.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h> /* Needed by all modules */
|
||||
#include <linux/kernel.h> /* Needed for KERN_INFO, printk() */
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h> /* We want an interrupt */
|
||||
#include <linux/irq.h> /* We want an interrupt */
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fs.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h> /*ioremap ioremap_nocache iounmap iowriteXX ioreadXX*/
|
||||
#include <linux/gpio.h>
|
||||
#include <asm/mach-jz4740/gpio.h>
|
||||
#include<asm/system.h> /*rmb*/
|
||||
|
||||
#define FPGA_IRQ_PIN JZ_GPIO_PORTC(15)
|
||||
#define FPGA_CS JZ_GPIO_PORTB(26)
|
||||
#define FPGA_BASE_BEGIN 0x15000000
|
||||
#define FPGA_BASE_END 0x17FFFFFF
|
||||
#define SUCCESS 0
|
||||
#define DEVICE_NAME "kbps2" /* Dev name as it appears in /proc/devices */
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Ari");
|
||||
MODULE_DESCRIPTION("Keyboard ps2");
|
||||
MODULE_VERSION("1.0");
|
||||
|
||||
/* Declaration of kbps2.c functions */
|
||||
static irqreturn_t irq_handler(int irq, void *dev_id);
|
||||
static int kbps2_open(struct inode *, struct file *);
|
||||
static int kbps2_release(struct inode *, struct file *);
|
||||
static ssize_t kbps2_read(struct file *, char *, size_t, loff_t *);
|
||||
static ssize_t kbps2_write(struct file *, const char *, size_t, loff_t *);
|
||||
static int __init kbps2_init(void);
|
||||
static void __exit kbps2_exit(void);
|
||||
|
||||
/* Structure that declares the usual file */
|
||||
/* access functions */
|
||||
struct file_operations fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = kbps2_read,
|
||||
.write = kbps2_write,
|
||||
.open = kbps2_open,
|
||||
.release = kbps2_release
|
||||
};
|
||||
|
||||
/* Declaration of the init and exit functions */
|
||||
module_init(kbps2_init);
|
||||
module_exit(kbps2_exit);
|
||||
|
||||
/* Global variables of the driver */
|
||||
static int irq_enabled = 0;
|
||||
static int is_device_open = 0; /* Is device open? Used to prevent multiple access to device */
|
||||
static int Major=65; /* Major number */
|
||||
static DECLARE_WAIT_QUEUE_HEAD(wq);
|
||||
static void __iomem *ioaddress;
|
||||
static unsigned int interrupt_counter = 0;
|
||||
|
||||
static int __init kbps2_init(void)
|
||||
{
|
||||
int res, irq, result;
|
||||
|
||||
barrier();
|
||||
|
||||
printk(KERN_INFO "FPGA module is Up.\n");
|
||||
interrupt_counter = 0;
|
||||
|
||||
/* Registering device */
|
||||
result = register_chrdev(Major, DEVICE_NAME, &fops);
|
||||
if (result < 0) {
|
||||
printk("<1>memory: cannot obtain major number %d\n", Major);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Set up the FGPA irq line */
|
||||
irq = gpio_to_irq(FPGA_IRQ_PIN);
|
||||
res = request_irq(irq, irq_handler, IRQF_DISABLED | IRQF_TRIGGER_RISING, "FPGA - IRQ", NULL); // IRQF_TRIGGER_FALLING
|
||||
irq_enabled = 1;
|
||||
printk(KERN_INFO "FPGA irq_enabled...\n");
|
||||
|
||||
/* Set GPIOB26 as part of External Memory Controller*/
|
||||
jz_gpio_set_function (FPGA_CS, JZ_GPIO_FUNC_NONE);
|
||||
/* Use ioremap to get a handle on our region */
|
||||
ioaddress = __ioremap(FPGA_BASE_BEGIN, FPGA_BASE_END - FPGA_BASE_BEGIN, _CACHE_UNCACHED);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit kbps2_exit(void)
|
||||
{
|
||||
// int ret;
|
||||
/*Tho order for free_irq, iounmap & unregister is very important */
|
||||
free_irq(FPGA_IRQ_PIN, NULL);
|
||||
__iounmap(ioaddress);
|
||||
unregister_chrdev(Major, DEVICE_NAME);
|
||||
printk(KERN_INFO "FPGA driver is down...\n");
|
||||
}
|
||||
|
||||
static irqreturn_t irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
unsigned int red;
|
||||
if(irq_enabled)
|
||||
{
|
||||
interrupt_counter++;
|
||||
printk(KERN_INFO "interrupt_counter=%d\n",interrupt_counter);
|
||||
red=ioread32(ioaddress)& 0XFF;
|
||||
rmb();
|
||||
printk("%X \n", red);
|
||||
wake_up_interruptible(&wq);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int kbps2_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (is_device_open)
|
||||
return -EBUSY;
|
||||
|
||||
is_device_open = 1;
|
||||
|
||||
try_module_get(THIS_MODULE);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int kbps2_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
is_device_open = 0;
|
||||
|
||||
module_put(THIS_MODULE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t kbps2_read(struct file *filp, char *buffer, size_t count, loff_t *offset)
|
||||
{
|
||||
unsigned int red;
|
||||
|
||||
printk(KERN_INFO "read______-_-\n");
|
||||
red=ioread32(ioaddress)& 0XFF;
|
||||
rmb();
|
||||
printk("%X\n", red);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t kbps2_write(struct file *filp, const char *buff, size_t count, loff_t * off)
|
||||
{
|
||||
|
||||
printk(KERN_INFO "write______-_-\n");
|
||||
printk("%X\n", buff[0]);
|
||||
iowrite32(buff[0],ioaddress);
|
||||
wmb();
|
||||
|
||||
return 1;
|
||||
}
|
||||
125
PS2_INTERFACE/drivers/memory.c
Executable file
125
PS2_INTERFACE/drivers/memory.c
Executable file
@@ -0,0 +1,125 @@
|
||||
/* Necessary includes for drivers */
|
||||
#include <linux/init.h>
|
||||
//#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h> /* printk() */
|
||||
#include <linux/slab.h> /* kmalloc() */
|
||||
#include <linux/fs.h> /* everything... */
|
||||
#include <linux/errno.h> /* error codes */
|
||||
#include <linux/types.h> /* size_t */
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/fcntl.h> /* O_ACCMODE */
|
||||
#include <linux/ioport.h>
|
||||
#include <asm/system.h> /* cli(), *_flags */
|
||||
#include <asm/uaccess.h> /* copy_from/to_user */
|
||||
#include <asm/io.h> /* inb, outb */
|
||||
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/* Declaration of memory.c functions */
|
||||
int memory_open(struct inode *inode, struct file *filp);
|
||||
int memory_release(struct inode *inode, struct file *filp);
|
||||
ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos);
|
||||
ssize_t memory_write(struct file *filp, char *buf, size_t count, loff_t *f_pos);
|
||||
void memory_exit(void);
|
||||
int memory_init(void);
|
||||
|
||||
/* Structure that declares the usual file */
|
||||
/* access functions */
|
||||
struct file_operations memory_fops = {
|
||||
read: memory_read,
|
||||
write: memory_write,
|
||||
open: memory_open,
|
||||
release: memory_release
|
||||
};
|
||||
|
||||
/* Declaration of the init and exit functions */
|
||||
module_init(memory_init);
|
||||
module_exit(memory_exit);
|
||||
|
||||
/* Global variables of the driver */
|
||||
/* Major number */
|
||||
int memory_major = 60;
|
||||
/* Buffer to store data */
|
||||
char *memory_buffer;
|
||||
|
||||
int memory_init(void) {
|
||||
|
||||
int result;
|
||||
|
||||
/* Registering device */
|
||||
result = register_chrdev(memory_major, "memory", &memory_fops);
|
||||
if (result < 0) {
|
||||
printk(
|
||||
"<1>memory: cannot obtain major number %d\n", memory_major);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Allocating memory for the buffer */
|
||||
memory_buffer = kmalloc(1, GFP_KERNEL);
|
||||
if (!memory_buffer) {
|
||||
result = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
memset(memory_buffer, 0, 1);
|
||||
|
||||
printk("<1>Inserting memory module\n");
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
memory_exit();
|
||||
return result;
|
||||
}
|
||||
|
||||
void memory_exit(void) {
|
||||
/* Freeing the major number */
|
||||
unregister_chrdev(memory_major, "memory");
|
||||
|
||||
/* Freeing buffer memory */
|
||||
if (memory_buffer) {
|
||||
kfree(memory_buffer);
|
||||
}
|
||||
|
||||
printk("<1>Removing memory module\n");
|
||||
|
||||
}
|
||||
|
||||
int memory_open(struct inode *inode, struct file *filp) {
|
||||
|
||||
/* Success */
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int memory_release(struct inode *inode, struct file *filp) {
|
||||
|
||||
/* Success */
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t memory_read(struct file *filp, char *buf,
|
||||
size_t count, loff_t *f_pos) {
|
||||
|
||||
/* Transfering data to user space */
|
||||
copy_to_user(buf,memory_buffer,1);
|
||||
|
||||
/* Changing reading position as best suits */
|
||||
if (*f_pos == 0) {
|
||||
*f_pos+=1;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t memory_write( struct file *filp, char *buf,
|
||||
size_t count, loff_t *f_pos) {
|
||||
|
||||
char *tmp;
|
||||
|
||||
tmp=buf+count-1;
|
||||
copy_from_user(memory_buffer,tmp,1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
149
PS2_INTERFACE/drivers/ps2_kb.c
Executable file
149
PS2_INTERFACE/drivers/ps2_kb.c
Executable file
@@ -0,0 +1,149 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <asm/mach-jz4740/gpio.h>
|
||||
|
||||
#define FPGA_IRQ_PIN JZ_GPIO_PORTC(15)
|
||||
#define FPGA_CS JZ_GPIO_PORTB(26)
|
||||
#define FPGA_BASE_BEGIN 0x15000000
|
||||
#define FPGA_BASE_END 0x17FFFFFF
|
||||
|
||||
static unsigned int key_p;
|
||||
static unsigned int key_e;
|
||||
|
||||
/*
|
||||
* Scancode to keycode tables. These are just the default setting, and
|
||||
* are loadable via a userland utility.
|
||||
*/
|
||||
|
||||
#define ATKBD_KEYMAP_SIZE 512
|
||||
|
||||
static const unsigned short atkbd_set2_keycode[ATKBD_KEYMAP_SIZE] = {
|
||||
|
||||
#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES
|
||||
//stream mode
|
||||
iowrite32(0x000000EA,ioaddress);
|
||||
mb();
|
||||
/* XXX: need a more general approach */
|
||||
|
||||
#include "hpps2atkbd.h" /* include the keyboard scancodes */
|
||||
|
||||
#else
|
||||
0, 67, 65, 63, 61, 59, 60, 88, 0, 68, 66, 64, 62, 15, 41,117,
|
||||
0, 56, 42, 93, 29, 16, 2, 0, 0, 0, 44, 31, 30, 17, 3, 0,
|
||||
0, 46, 45, 32, 18, 5, 4, 95, 0, 57, 47, 33, 20, 19, 6,183,
|
||||
0, 49, 48, 35, 34, 21, 7,184, 0, 0, 50, 36, 22, 8, 9,185,
|
||||
0, 51, 37, 23, 24, 11, 10, 0, 0, 52, 53, 38, 39, 25, 12, 0,
|
||||
0, 89, 40, 0, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0, 85,
|
||||
0, 86, 91, 90, 92, 0, 14, 94, 0, 79,124, 75, 71,121, 0, 0,
|
||||
82, 83, 80, 76, 77, 72, 1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
|
||||
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
217,100,255, 0, 97,165, 0, 0,156, 0, 0, 0, 0, 0, 0,125,
|
||||
173,114, 0,113, 0, 0, 0,126,128, 0, 0,140, 0, 0, 0,127,
|
||||
159, 0,115, 0,164, 0, 0,116,158, 0,172,166, 0, 0, 0,142,
|
||||
157, 0, 0, 0, 0, 0, 0, 0,155, 0, 98, 0, 0,163, 0, 0,
|
||||
226, 0, 0, 0, 0, 0, 0, 0, 0,255, 96, 0, 0, 0,143, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0,105,102, 0, 0,112,
|
||||
110,111,108,112,106,103, 0,119, 0,118,109, 0, 99,104,119, 0,
|
||||
|
||||
0, 0, 0, 65, 99,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct input_dev *ps2kbd_dev;
|
||||
static void __iomem *ioaddress;
|
||||
|
||||
static irqreturn_t ps2_keyboard_interrupt(int irq, void *id)
|
||||
{
|
||||
unsigned char scancode, keycode;
|
||||
|
||||
scancode = (unsigned char)(ioread32(ioaddress)& 0XFF);
|
||||
rmb();
|
||||
|
||||
//printk(KERN_INFO "scancode %x\n", scancode);
|
||||
|
||||
if (scancode == 0xAA)printk(KERN_INFO "PS/2 keyboard. ok\n");
|
||||
else if (scancode == 0xFC)printk(KERN_INFO "PS/2 keyboard. error\n");
|
||||
else if (scancode == 0xF0)key_p=0;
|
||||
else if (scancode == 0xE0)key_e=1;
|
||||
else if (scancode <= 0x7E){ /* scancodes < 0xf2 are keys */
|
||||
|
||||
keycode = atkbd_set2_keycode[scancode+0x80*key_e];
|
||||
|
||||
input_report_key(ps2kbd_dev, keycode, key_p);
|
||||
input_sync(ps2kbd_dev);
|
||||
key_p=1;
|
||||
key_e=0;
|
||||
} else /* scancodes >= 0xf2 are mouse data, most likely */
|
||||
printk(KERN_INFO "ps2kbd: unhandled scancode %x\n", scancode);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __init ps2_keyboard_init(void)
|
||||
{
|
||||
|
||||
int i, error, res, irq;
|
||||
|
||||
key_p=1;
|
||||
key_e=0;
|
||||
|
||||
ps2kbd_dev = input_allocate_device();
|
||||
if (!ps2kbd_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
ps2kbd_dev->name = "PS2 Keyboard";
|
||||
ps2kbd_dev->phys = "ps2kbd/input0";
|
||||
ps2kbd_dev->id.bustype = BUS_HOST;
|
||||
ps2kbd_dev->id.vendor = 0x0001;
|
||||
ps2kbd_dev->id.product = 0x0001;
|
||||
ps2kbd_dev->id.version = 0x0100;
|
||||
|
||||
ps2kbd_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
|
||||
ps2kbd_dev->keycode = atkbd_set2_keycode;
|
||||
ps2kbd_dev->keycodesize = sizeof(unsigned short);
|
||||
ps2kbd_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
|
||||
|
||||
for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) {
|
||||
set_bit(atkbd_set2_keycode[i], ps2kbd_dev->keybit);
|
||||
}
|
||||
|
||||
/* error check */
|
||||
error = input_register_device(ps2kbd_dev);
|
||||
if (error) {
|
||||
input_free_device(ps2kbd_dev);
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Set up the FGPA irq line */
|
||||
irq = gpio_to_irq(FPGA_IRQ_PIN);
|
||||
res = request_irq(irq, ps2_keyboard_interrupt, IRQF_DISABLED | IRQF_TRIGGER_RISING, "FPGA - IRQ", NULL); // IRQF_TRIGGER_FALLING
|
||||
|
||||
/* Set GPIOB26 as part of External Memory Controller*/
|
||||
jz_gpio_set_function (FPGA_CS, JZ_GPIO_FUNC_NONE);
|
||||
/* Use ioremap to get a handle on our region */
|
||||
ioaddress = __ioremap(FPGA_BASE_BEGIN, FPGA_BASE_END - FPGA_BASE_BEGIN, _CACHE_UNCACHED);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit ps2_keyboard_exit(void)
|
||||
{
|
||||
free_irq(FPGA_IRQ_PIN, NULL);
|
||||
__iounmap(ioaddress);
|
||||
input_unregister_device(ps2kbd_dev);
|
||||
}
|
||||
|
||||
module_init(ps2_keyboard_init);
|
||||
module_exit(ps2_keyboard_exit);
|
||||
|
||||
MODULE_AUTHOR("Ari Bejarano <aabejaranoh@unal.edu.co>");
|
||||
MODULE_DESCRIPTION("PS/2 Keyboard Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:ps2-keyboard");
|
||||
Reference in New Issue
Block a user