手指恋上烟 发表于 2013-3-12 10:21:44

6410GPIO驱动问题

我是把GPRS的TXD1 RXD1 RTSN1 CTSN1作为GPIO引脚来使用,仿写了驱动,但是无法控制这4个引脚的电平。
驱动代码如下:
/*************************************

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, 0);
                        return 0;

                case IOCTL_GPIO_OFF:
                        s3c_gpio_setpin(gpio_table, 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");



TQ-ZQL 发表于 2013-3-12 10:52:52

      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);

      }
这很明显有问题吧。

手指恋上烟 发表于 2013-3-12 10:55:50

TQ-ZQL 发表于 2013-3-12 10:52 static/image/common/back.gif
for (i = 0; i < 4; i++)
      {
                s3c_gpio_cfgpin(gpio_table, gpio_cfg_tab ...

复制过来的时候丢失了,内核编译时没问题的。

手指恋上烟 发表于 2013-3-12 10:56:28

本帖最后由 手指恋上烟 于 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, 0);
                        return 0;

                case IOCTL_GPIO_OFF:
                        s3c_gpio_setpin(gpio_table, 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");

手指恋上烟 发表于 2013-3-12 10:56:59

。。。又没了

TQ-ZQL 发表于 2013-3-12 14:18:47

将初始化 放到open函数看下,在调用ioctl时打印相关寄存器(引脚配置),看有没有不同

手指恋上烟 发表于 2013-3-14 10:23:48

TQ-ZQL 发表于 2013-3-12 14:18 static/image/common/back.gif
将初始化 放到open函数看下,在调用ioctl时打印相关寄存器(引脚配置),看有没有不同

问题解决了,2.6.30内核的ioctl函数有inode参数,3.0内核的unlocked_ioctl()没有inode参数
页: [1]
查看完整版本: 6410GPIO驱动问题