#include #include #include #include #include #include #define DEVICE_NAME "lkm03" #define MAJOR_NUM 42 #define PIN_NUM 3 #define BCM2708_PERI_BASE 0x20000000 #define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) // GPIO controller /* macros - use INP_GPIO(x) before using OUT_GPIO(x) */ #define INP_GPIO(g) *(gpio.addr + ((g)/10)) &= ~(7<<(((g)%10)*3)) #define OUT_GPIO(g) *(gpio.addr + ((g)/10)) |= (1<<(((g)%10)*3)) #define SET_GPIO_ALT(g,a) *(gpio.addr + (((g)/10))) |= (((a)<=3?(a) + 4:(a)==4?3:2)<<(((g)%10)*3)) #define GPIO_SET *(gpio.addr + 7) #define GPIO_CLR *(gpio.addr + 10) #define GPIO_READ(g) *(gpio.addr + 13) &= (1<<(g)) struct bcm2835_peripheral { unsigned long addr_p; int mem_fd; void *map; volatile unsigned int *addr; }; struct bcm2835_peripheral gpio = {GPIO_BASE}; static int lkm03_open(struct inode *inode, struct file *file){ pr_info("%s\n", __func__); return 0; } static int lkm03_release(struct inode *inode, struct file *file){ pr_info("%s\n", __func__); return 0; } static ssize_t lkm03_read(struct file *file, char *buffer, size_t length, loff_t * offset){ pr_info("%s %u\n", __func__, length); return 0; } static ssize_t lkm03_write(struct file *file, const char *buffer, size_t length, loff_t * offset){ pr_info("%s %u\n", __func__, length); return length; } struct file_operations lkm03_fops = { .owner = THIS_MODULE, .open = lkm03_open, .release = lkm03_release, .read = lkm03_read, .write = lkm03_write, }; int __init lkm03_init(void){ int ret; pr_info("%s\n", __func__); ret = register_chrdev(MAJOR_NUM, DEVICE_NAME, &lkm03_fops); if (ret != 0) return ret; gpio.map = ioremap(GPIO_BASE, 4096); gpio.addr = (volatile unsigned int *)gpio.map; INP_GPIO(PIN_NUM); OUT_GPIO(PIN_NUM); GPIO_SET = 1 << PIN_NUM; printk("CMP408: lkm03 loaded\n"); return 0; } void __exit lkm03_exit(void){ unregister_chrdev(MAJOR_NUM, DEVICE_NAME); GPIO_CLR = 1 << PIN_NUM; if (gpio.addr){ iounmap(gpio.addr); } printk("CMP408: lkm03 unloaded\n"); } module_init(lkm03_init); module_exit(lkm03_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("AR CMP408"); MODULE_DESCRIPTION("A lkm03 driver"); MODULE_VERSION("0.4");