天嵌 ARM开发社区

 找回密码
 注册
查看: 1596|回复: 6

驱动打印信息没问题,为什么执行不对呢?

[复制链接]
鬼鬼一哈 发表于 2010-10-16 16:13:58 | 显示全部楼层 |阅读模式
本帖最后由 鬼鬼一哈 于 2010-10-16 16:28 编辑

///////////////测试程序//////////
int main()
{
   int i =4;
   int dev_fd;
   dev_fd = open(GPIO_DEVICE_FILENAME, O_RDWR | O_NONBLOCK);
   if( dev_fd == -1)
       {
            printf("Cann't open gpio device file\n");
            exit(1);
        }
   printf("fd= %d\n",dev_fd);
   while(i)
        {
          i--;
          ioctl(dev_fd,  LED_ON,  i );
          sleep(1);
          ioctl(dev_fd,  LED_OFF, i );
          sleep(1);
          ioctl(dev_fd, LED_ON, i );
          printf(" %d\n",i);
         }
   close(dev_fd);
   return 0;
}
////////////////////驱动部分函数///////////////////////
我在驱动的open函数ioctl函数里加几个打印信息的语句
int gpio_open(struct inode *inode, struct file *file)
{
   s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP);
   s3c2410_gpio_cfgpin(S3C2410_GPB6,S3C2410_GPB6_OUTP);
   s3c2410_gpio_cfgpin(S3C2410_GPB7,S3C2410_GPB7_OUTP);
   s3c2410_gpio_cfgpin(S3C2410_GPB8,S3C2410_GPB8_OUTP);
   printk("Open success.\n");
   return 0;
}

static int gpio_ioctl(struct inode *inode,struct file *file, unsigned int cmd,unsigned long arg)
{
   if ( arg > 4)  { return -EINVAL; }
   switch(cmd)
      {
           case LED_ON:    {  s3c2410_gpio_setpin(GPIO_TAB[arg], LED_ON);
                              printk("On success.\n");
                            }break;
           case LED_OFF:   {  s3c2410_gpio_setpin(GPIO_TAB[arg], LED_OFF);
                              printk("Off success.\n");
                           }break;
           default:
               {
                  printk("Unsupported command\n");
                  break;
               }
      }
   return 0;
}
驱动加载好然后执行这个测试程序。。打印出来的有
Open success.
fd = 3
On success.
Off success.
On success.
3
On success.
Off success.
On success.
2
On success.
Off success.
On success.
1
On success.
Off success.
On success.
0
Close success.  (在release函数里)
都按我的要求执行了。为什么LED灯就没照我的要求亮灭呢?
s3c2410_gpio_setpin和s3c2410_gpio_cfgpin函数是TQ自己定义好的。我没有自己写!
天嵌_support1 发表于 2010-10-16 16:58:47 | 显示全部楼层
1# 鬼鬼一哈


把你的 GPIO_TAG[] 数组直接利用引脚名称 例如S3C2410_GPB5代替来看看
 楼主| 鬼鬼一哈 发表于 2010-10-16 17:01:26 | 显示全部楼层
static unsigned long GPIO_TAB[] =
{
   S3C2410_GPB5,
   S3C2410_GPB6,
   S3C2410_GPB7,
   S3C2410_GPB8,
};我是这样定义的。。。
 楼主| 鬼鬼一哈 发表于 2010-10-16 22:21:25 | 显示全部楼层
本帖最后由 鬼鬼一哈 于 2010-10-16 22:46 编辑

2# embedsky_lxt

我把LED口换成蜂鸣器就可以工作,不知道为什么。。。
 楼主| 鬼鬼一哈 发表于 2010-10-16 22:57:09 | 显示全部楼层
本帖最后由 鬼鬼一哈 于 2010-10-16 23:06 编辑

编写这个LED驱动用不用屏蔽内核自带的那个LED驱动呢?
就是说什么在2.6.25.8的内核里,源码在drivers/leds/leds-s3c24xx.c,在arch/arm/plat-s3c24xx/common-smdk.c文件中有该驱动的注册信息。。
用屏蔽么?我觉得不用吧。我又不烧那个新的内核镜像。。
summersunboy 发表于 2010-10-20 00:17:38 | 显示全部楼层
本帖最后由 summersunboy 于 2010-10-20 00:20 编辑

在 test.c 的ioctl中 参数和命令 你写反了
static int gpio_ioctl(struct inode *inode,struct file *file, unsigned int cmd,unsigned
long arg)
应该是这样:
  1. int led_timer(int dev_fd, int led_no, unsigned int time)
  2. {
  3.    led_no %= 4;
  4.    ioctl(dev_fd,  LED_ON, led_no); //你原先写的是 ioctl(dev_fd, led_no, LED_ON);
  5.    sleep(time);
  6.    ioctl(dev_fd,  LED_OFF, led_no);
  7.    sleep(time);
  8.    ioctl(dev_fd,  LED_ON, led_no);
  9. }
复制代码
 楼主| 鬼鬼一哈 发表于 2010-10-20 08:59:30 | 显示全部楼层
6# summersunboy


我改了也不行,但是驱动蜂鸣器就可以。。。。。
斑斑说要把内核的LED驱动给屏蔽了编译后在烧到班子里才可以用这个驱动,,我已经把按键,pwm的实验做完了,,在看ADC和触摸屏了。。。LED就先算了、、
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-10-5 20:26 , Processed in 1.027278 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表