免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1990 | 回复: 4
打印 上一主题 下一主题

求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 21:52 |只看该作者 |倒序浏览
在Linux2.6.24驱动开发过程中,编写了一个测试软件;
                  以下为函数的一部分:
                         fp=open("dev/driver",2);
                                        if(fp==-1)
                                              printf("This is error");
              为什么我们在编译通过后,执行的时候就打印出来This  is error  呢?

论坛徽章:
5
2 [报告]
发表于 2009-03-12 21:54 |只看该作者
因为fp == -1阿,所以就打印这个结果罗

至于为什么fp == -1? 你需要提供更多信息

论坛徽章:
0
3 [报告]
发表于 2009-03-12 21:57 |只看该作者

回复 #1 chenxiaoyou8 的帖子

上下文信息太少了

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 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来看

论坛徽章:
0
5 [报告]
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP