#include#include #include #include #include #include #include #include #include #include #include #define DEV_MINOR 0 #define DEV_CNT 1 #define DEV_DATA_SIZE 127 #define BEEP_ON _IO('i', 0) #define BEEP_OFF _IO('i', 1) void __iomem * base_gpioc = NULL; char data[DEV_DATA_SIZE + 1] = {0}; ssize_t myread (struct file * fp, char __user * buf, size_t size, loff_t * offset) { int ret; printk("enter myreadn"); if(size > DEV_DATA_SIZE) { size = DEV_DATA_SIZE; } ret = copy_to_user(buf, data, size); if(ret) { printk("copy to user error.n"); return -EFAULT; } return 0; } int myrelease (struct inode * pnode, struct file * fp) { printk("enter myreleasen"); return 0; } int myopen (struct inode * pnode, struct file * fp) { printk("enter myopenn"); return 0; } ssize_t mywrite (struct file * fp, const char __user *buf, size_t size, loff_t *offset) { int ret; printk("enter writen"); if(size > 127) { printk("size is invalid.n"); return -ENOMEM; } ret = copy_from_user(data, buf, size); if(ret) { printk("copy from user error.n"); return -EFAULT; } return 0; } long myioctl (struct file * fp, unsigned int cmd, unsigned long data) { switch(cmd) { case BEEP_ON: iowrite32(ioread32(base_gpioc)|(0x01<<14), base_gpioc); break; case BEEP_OFF: iowrite32(ioread32(base_gpioc)&~(0x01<<14), base_gpioc); break; default: printk("invalid input.n"); break; } return 0; } const struct file_operations beep_fops = { .owner = THIS_MODULE, .open = myopen, .read = myread, .write = mywrite, .unlocked_ioctl = myioctl, }; struct miscdevice beep_dev = { .minor = MISC_DYNAMIC_MINOR, .name = "beep", .fops = &beep_fops }; int beep_init(void) { int ret; ret = misc_register(&beep_dev); if(ret<0) { printk("misc register failed!n"); goto misc_retister_fail; } base_gpioc = ioremap(PHY_baseADDR_GPIOC, SZ_64); if(IS_ERR_OR_NULL(base_gpioc)) { printk("ioremap error.n"); goto ioremap_fail; } iowrite32((ioread32(base_gpioc+0x20)&~(0x03<<28))|(0x01<<28), base_gpioc + 0x20); iowrite32(ioread32(base_gpioc+0x04)|(0x01<<14), base_gpioc+0x04); iowrite32(ioread32(base_gpioc)&~(0x01<<14), base_gpioc); printk("beep dev driver init completed.n"); return 0; ioremap_fail: misc_deregister(&beep_dev); misc_retister_fail: return -1; } kobject_create_and_add(const char * name, struct kobject * parent) void beep_exit(void) { iounmap(base_gpioc); misc_deregister(&beep_dev); printk("device unregister completed.n"); } module_init(beep_init); module_exit(beep_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("David-Woo"); MODULE_DEscriptION("char device driver example");



