#include #include #include #include #include #define DEVICE_NAME "seeprom" #define RANDOM_READ_BYTE 1000 #define RANDOM_WRITE_BYTE 2000 struct address_data { int address, data; }; int write_data(int addr, unsigned char data); int read_data(int addr); static int Major; static int i2c_ioctl (struct inode *inode, struct file *file, unsigned int ioctl_num, unsigned long ioctl_param) { struct address_data ad; int addr, r; switch(ioctl_num) { case RANDOM_READ_BYTE: get_user(addr, (int*)ioctl_param); r = read_data(addr); if (r == -1) return -EIO; put_user(r, (int*)ioctl_param); break; case RANDOM_WRITE_BYTE: copy_from_user(&ad, (struct address_data*)ioctl_param, sizeof(struct address_data)); r = write_data(ad.address, ad.data); if (r == -1) return -EIO; break; default: return -EIO; } return 0; } static struct file_operations fops = { .ioctl = i2c_ioctl, }; int init_module (void) { Major = register_chrdev (0, DEVICE_NAME, &fops); if (Major < 0) { printk("Registering the character device "); printk("failed with %d\n", Major); return Major; } return 0; } void cleanup_module (void) { int ret = unregister_chrdev (Major, DEVICE_NAME); if (ret < 0) printk ("Error in unregistering: %d\n", ret); }