kobox之TQ2440 key驱动
一. 实现目标:
按按键K1,蜂鸣器响一声
按按键K2,蜂鸣器响二声
按按键K3,蜂鸣器响三声
按按键K4,蜂鸣器响四声
二. 按键GPIO:
GPB5, GPB6, GPB7, GPB8 --- LED1, LED2, LED3, LED4
GPF1, GPF4, GPF2, GPF0 --- K1, K2, K3, K4
三. 框架
#include "key.h" // ref arch/arm/mach-s3c24xx/mach-mini2440.c how to set gpio MODULE_LICENSE("GPL"); /* datasheet: page274 — Port A(GPA): 25-output port — Port B(GPB): 11-input/out port — Port C(GPC): 16-input/output por — Port D(GPD): 16-input/output por — Port E(GPE): 16-input/output por — Port F(GPF): 8-input/output port — Port G(GPG): 16-input/output po — Port H(GPH): 9-input/output port — Port J(GPJ): 13-input/output port */ /* GPB5, GPB6, GPB7, GPB8 --- LED1, LED2, LED3, LED4 GPF1, GPF4, GPF2, GPF0 --- K1, K2, K3, K4 */ #define S3C_ADDR_BASE 0xF6000000 #define S3C_ADDR(x) (S3C_ADDR_BASE + (x)) #define S3C2410_PA_UART (0x50000000) #define S3C2410_PA_GPIO (0x56000000) #define S3C_VA_UART S3C_ADDR(0x01000000) /* UART */ #define S3C24XX_PA_UART S3C2410_PA_UART #define S3C24XX_VA_UART S3C_VA_UART #define S3C24XX_PA_GPIO S3C2410_PA_GPIO #define S3C24XX_VA_GPIO ((S3C24XX_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART) #define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO) #define S3C2410_GPBCON S3C2410_GPIOREG(0x10) #define S3C2410_GPBDAT S3C2410_GPIOREG(0x14) #define S3C2410_GPBUP S3C2410_GPIOREG(0x18) static int kobox_key_open(struct inode *inode, struct file *file) { return 0; } static int kobox_key_release(struct inode *inode, struct file *file) { return 0; } static long kobox_key_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { return 0; } struct file_operations kobox_key_operations = { .owner = THIS_MODULE, .open = kobox_key_open, .release = kobox_key_release, .unlocked_ioctl = kobox_key_ioctl, }; //GPB0 int major; int minor; struct cdev cdev; struct class *kobox_key_class; struct device *pstdev = NULL; #define GPIO_KEY_NAME "kobox_key" int __init key_drv_init(void) { int error; dev_t dev; printk("#####enter key_drv_init!\n"); major = register_chrdev(0, GPIO_KEY_NAME, &kobox_key_operations); if (major < 0) { printk(" can't register major number\n"); return major; } /* create class */ kobox_key_class = class_create(THIS_MODULE, GPIO_KEY_NAME); if(IS_ERR(kobox_key_class)) { printk("class_create failed!\n"); goto fail; } /* create /dev/kobox_gpio */ pstdev = device_create(kobox_key_class, NULL, MKDEV(major, 0), NULL, GPIO_KEY_NAME); if(!pstdev) { printk("device_create failed!\n"); goto fail1; } printk("#####key_drv_init ok!\n"); return 0; fail1: class_destroy(kobox_key_class); fail: unregister_chrdev(major, GPIO_KEY_NAME); return -1; } void __exit key_drv_exit(void) { printk("exit gpio drv!\n"); device_destroy(kobox_key_class, MKDEV(major, 0)); class_destroy(kobox_key_class); unregister_chrdev(major, GPIO_KEY_NAME); return; } module_init(key_drv_init); module_exit(key_drv_exit);