Chinaunix

标题: 求助 [打印本页]

作者: chenxiaoyou8    时间: 2009-03-12 21:52
标题: 求助
在Linux2.6.24驱动开发过程中,编写了一个测试软件;
                  以下为函数的一部分:
                         fp=open("dev/driver",2);
                                        if(fp==-1)
                                              printf("This is error");
              为什么我们在编译通过后,执行的时候就打印出来This  is error  呢?
作者: yidou    时间: 2009-03-12 21:54
因为fp == -1阿,所以就打印这个结果罗

至于为什么fp == -1? 你需要提供更多信息
作者: kns1024wh    时间: 2009-03-12 21:57
标题: 回复 #1 chenxiaoyou8 的帖子
上下文信息太少了
作者: dreamice    时间: 2009-03-12 22:25
原帖由 chenxiaoyou8 于 2009-3-12 21:52 发表
在Linux2.6.24驱动开发过程中,编写了一个测试软件;
                  以下为函数的一部分:
                         fp=open("dev/driver",2);
                                        if(fp==-1)
   ...



man 2 open
看看这个怎么用?
open这个东西是什么?
再看一下是什么err吧,根据errno来看
作者: chenxiaoyou8    时间: 2009-03-13 08:48
我使用的是Xilinx公司产Emulation Baseboard开发板,自己动手编写了一个Led的驱动程序,而进行的测试
下面是编写的程序,但是我无法创建出节点,请指教
#define     LEDSMINOR 0

void __iomem * led_vir_base_add = NULL;
static int LEDSMajor=231;
static long ledstatus=ALL_LEDS;



static int Updateleds(void)
{
   int i,j;
for(j=0;j<3;j++)
&nbsp;&nbsp;{ for (i=0;i<8;i++)
&nbsp;&nbsp;&nbsp;{switch(i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ case 0:  if(ledstatus&0x01)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ mdelay(1000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writel(0x01,led_vir_base_add); } //light on

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { mdelay(1000);writel(0x00,led_vir_base_add);}break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 1:  if(ledstatus&0x02)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;               {mdelay(1000);writel(0x02,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { mdelay(1000);writel(0x00,led_vir_base_add);}break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 2:  if(ledstatus&0x04)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;               {mdelay(1000);writel(0x04,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {mdelay(1000);writel(0x00,led_vir_base_add);} break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 3:  if(ledstatus&0x08)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;               {mdelay(1000);writel(0x08,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {mdelay(1000);writel(0x00,led_vir_base_add);} break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 4:  if(ledstatus&0x10)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;              { mdelay(1000);writel(0x10,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {mdelay(1000);writel(0x00,led_vir_base_add);} break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 5:  if(ledstatus&0x20)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;             { mdelay(1000);writel(0x20,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { mdelay(1000);writel(0x00,led_vir_base_add);}break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 6: if(ledstatus&0x40)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;              {mdelay(1000);writel(0x40,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { mdelay(1000);writel(0x00,led_vir_base_add);} break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 7:  if(ledstatus&0x80)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;             { mdelay(1000);writel(0x80,led_vir_base_add);}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {mdelay(1000); writel(0x00,led_vir_base_add);}break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;return 0;
}


static ssize_t Leds_write(struct file *file,char *buffer,size_t count,loff_t *ppos)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Updateleds();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("write\n");
&nbsp;&nbsp;&nbsp;&nbsp;return sizeof(ledstatus);
&nbsp;
}

static int Leds_open(struct inode *inode,struct file *filp)
{
&nbsp;&nbsp;printk(KERN_INFO"open\n");
&nbsp;&nbsp;try_module_get(THIS_MODULE);
&nbsp;&nbsp;return 0;
&nbsp;
}

static int Leds_release(struct inode *inode,struct file *filp)
{
&nbsp;printk(KERN_INFO"release\n");
&nbsp;module_put(THIS_MODULE);
&nbsp;&nbsp;return 0;
}


static struct file_operations leds_fops = {
&nbsp;&nbsp;&nbsp;&nbsp;.owner=THIS_MODULE,
&nbsp;&nbsp;&nbsp;&nbsp;.open=Leds_open,
&nbsp;&nbsp;&nbsp;&nbsp;.write=Leds_write,
&nbsp;&nbsp;&nbsp;&nbsp;.release=Leds_release,
};


struct cdev *my_cdev;
struct class *my_class;
static int __init leds_init(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int err,devno=MKDEV(LEDSMajor,LEDSMINOR);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long temp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u32 temp0;
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;temp=0xffffff00;
&nbsp;&nbsp;led_vir_base_add=ioremap(LED_BANK,0x04);
&nbsp;&nbsp;&nbsp;&nbsp;printk("base=%lx\n",led_vir_base_add);
&nbsp;&nbsp;writel(temp,led_vir_base_add);
&nbsp;&nbsp;temp0=readl(led_vir_base_add);
&nbsp;&nbsp;printk("LED_BANK:%lx\n",temp0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Updateleds();
/*register the 'dummy_dev' char device*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_cdev=cdev_alloc();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cdev_init(my_cdev,&leds_fops);
&nbsp;&nbsp;&nbsp;&nbsp;  my_cdev->owner=THIS_MODULE;
&nbsp;&nbsp;&nbsp;&nbsp; err=cdev_add(my_cdev,devno,1);
&nbsp;&nbsp;&nbsp;&nbsp; if(err!=0)
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;printk("led device register failed!\n");
/*creating your own class*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_class = class_create(THIS_MODULE, "led");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(IS_ERR(my_class)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk("Err:failed in creating class.\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
/*register your own device in sysfs,and this will cause udevd to create corresponding device node*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_device_create(my_class, NULL,devno,NULL,DEVICE_NAME"%d",LEDSMINOR);

&nbsp;&nbsp;&nbsp;&nbsp;   printk(DEVICE_NAME " initialized\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

static void __exit leds_exit(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;cdev_del(my_cdev);
&nbsp;&nbsp;&nbsp;&nbsp;class_device_destroy(my_class,MKDEV(LEDSMajor,LEDSMINOR));
&nbsp;&nbsp;&nbsp;&nbsp;class_destroy(my_class);
}


[ 本帖最后由 dreamice 于 2009-3-13 09:08 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2