|  | 
| 本帖最后由 手指恋上烟 于 2013-3-12 11:04 编辑 
 /*************************************
 
 NAME:EmbedSky_hello.c
 COPYRIGHT:www.embedsky.net
 
 *************************************/
 #include <linux/miscdevice.h>
 #include <linux/input.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <mach/map.h>
 #include <mach/gpio.h>
 #include <plat/gpio-cfg.h>
 #include <plat/gpio-bank-a.h>
 
 
 #define DEVICE_NAME "GPIO-Control"
 
 /* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数 */
 #define IOCTL_GPIO_ON        1
 #define IOCTL_GPIO_OFF        0
 
 /* 用来指定LED所用的GPIO引脚 */
 static unsigned long gpio_table[] =
 {
 S3C64XX_GPA(4),
 S3C64XX_GPA(5),
 S3C64XX_GPA(6),
 S3C64XX_GPA(7),
 };
 
 /* 用来指定GPIO引脚的功能:输出 */
 static unsigned int gpio_cfg_table[] =
 {
 S3C64XX_GPA_OUTPUT(4),
 S3C64XX_GPA_OUTPUT(5),
 S3C64XX_GPA_OUTPUT(6),
 S3C64XX_GPA_OUTPUT(7),
 
 };
 
 static int tq2440_gpio_ioctl(
 struct inode *inode,
 struct file *file,
 unsigned int cmd,
 unsigned long arg)
 {
 if (arg > 4)
 {
 return -EINVAL;
 }
 
 switch(cmd)
 {
 case IOCTL_GPIO_ON:
 s3c_gpio_setpin(gpio_table[arg], 0);
 return 0;
 
 case IOCTL_GPIO_OFF:
 s3c_gpio_setpin(gpio_table[arg], 1);
 return 0;
 
 default:
 return -EINVAL;
 }
 }
 
 static struct file_operations dev_fops = {
 .owner        =        THIS_MODULE,
 .unlocked_ioctl        =        tq2440_gpio_ioctl,
 };
 
 static struct miscdevice misc = {
 .minor = MISC_DYNAMIC_MINOR,
 .name = DEVICE_NAME,
 .fops = &dev_fops,
 };
 
 static int __init dev_init(void)
 {
 int ret;
 
 int i;
 
 for (i = 0; i < 4; i++)
 {
 s3c_gpio_cfgpin(gpio_table, gpio_cfg_table);
 s3c_gpio_setpin(gpio_table, 1);
 s3c_gpio_setpull(gpio_table, S3C_GPIO_PULL_NONE);
 
 }
 
 ret = misc_register(&misc);
 
 printk (DEVICE_NAME" initialized\n");
 
 return ret;
 }
 
 static void __exit dev_exit(void)
 {
 misc_deregister(&misc);
 }
 
 module_init(dev_init);
 module_exit(dev_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("www.embedsky.net");
 MODULE_DESCRIPTION("GPIO control for EmbedSky SKY2440/TQ2440 Board");
 
 | 
 |