#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define RDWR_DEV_NAME "rdwrdev"
#define RDWR_DEV_MAJOR 240
#define RDWR_WRITE_ADDR 0x0378
#define RDWR_READ_ADDR 0x0379
int rdwr_open (struct inode *inode, struct file *filp)
{
return 0;
}
ssize_t rdwr_read (struct file *filp, char *buf, size_t count, loff_t *f_ops)
{
unsigned char status;
int loop;
for (loop = 0; loop < count; loop++) {
status = inb (RDWR_READ_ADDR);
put_user (status, (char *) & buf [loop]);
}
return count;
}
ssize_t rdwr_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)
{
unsigned char status;
int loop;
for (loop = 0; loop < count; loop++) {
get_user (status, (char *)buf);
outb (status, RDWR_WRITE_ADDR);
}
return count;
}
int rdwr_release (struct inode *inode, struct file *filp)
{
return 0;
}
struct file_operations rdwr_fops =
{
.owner = THIS_MODULE,
.read = rdwr_read,
.write = rdwr_write,
.open = rdwr_open,
.release = rdwr_release,
};
int rdwr_init (void)
{
int result;
result = register_chrdev (RDWR_DEV_MAJOR, RDWR_DEV_NAME, &rdwr_fops);
if (result < 0) return result;
return 0;
}
void rdwr_exit (void)
{
unregister_chrdev (RDWR_DEV_MAJOR, RDWR_DEV_NAME);
}
module_init (rdwr_init);
module_exit (rdwr_exit);
MODULE_LICENSE ("Dual BSD/GPL");
obj-m := rdwrdev.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf *.o
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#define DEVICE_FILENAME "/dev/rdwrdev"
int main()
{
int dev;
char buff [128];
int loop;
dev = open (DEVICE_FILENAME, O_RDWR | O_NDELAY);
if (dev >= 0) {
printf ("waiting ... input\n");
while (1) {
if (read (dev, buff, 1) == 1) {
printf ("read data [%02X]\n", buff [0] & 0xFF);
if (!(buff [0] & 0x10))
break;
}
}
printf ("input ok ... \n");
printf ("led falshing ... \n");
for (loop = 0; loop < 5; loop++) {
buff [0] = 0xFF;
write (dev, buff, 1);
sleep (1);
buff [0] = 0x00;
write (dev, buff, 1);
sleep (1);
}
close (dev);
} else {
perror ("open device");
exit (1);
}
return (0);
}
read data [6F]
input ok ...
led falshing ...
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |