登录
注册
一键加入QQ群
友善之臂官方网站
首 页
联系我们
淘宝店铺
维基教程
固件下载
资料汇总
搜索帖子!
NanoPC 系列:
NanoPC-T2
NanoPC-T3 Plus
NanoPC-T4
NanoPC-T6
NanoPC-T6 Plus
NanoPi 系列:
NanoPi-NEO
NEO Core
NEO Air
M1 Plus
Duo2
NEO3
NEO4
M4B
M5
M6
M6V2
核心板:
Smart4418
Core4418
Smart6818
Core6818
SOM-RK3399V2
CM3588
CM3588 Plus
迷你R系列:
NanoPi-R1
R1S
R2S
R2S Plus
Zero2
R3S
R76S
R4S
R5S
R5C
R6C
R6S
热门版块:
开发板销售中心
开发板硬件讨论区
硬软DIY及开发
嵌入式交流与讨论
友友粉丝快线
Ubuntu技术交流区
默认风格
用户中心首页
编辑个人资料
查看个人资料
好友列表
用户权限查看
积分管理
积分转换
特殊组购买
收藏夹
我的主题
基本统计信息
到访IP统计
管理团队
管理统计
在线统计
会员排行
版块排行
帖子排行
个人首页
我的收藏
好友近况
Linux技术交流区
测试测序中的open无法打开设备问件
友友粉丝快线
开发板销售中心
嵌入式最新资讯
友善之臂最新动态
友善之臂官方客服中心
开发板实战手册及教程
应用方案和定制开发
NanoPi 交流与讨论
NanoPi 玩家交流区
ROM发布区
硬软DIY及开发
嵌入式交流与讨论
Android技术交流区
Linux技术交流区
U-boot技术交流区
WinCE技术交流区
Ubuntu技术交流区
裸机程序和微型OS
OpenWRT讨论区
开发板硬件讨论区
相关资料下载及使用技巧
站点服务
二手交易区
我的论坛我的贴
站务管理与公告
上一主题
下一主题
新 帖
主题 : 测试测序中的open无法打开设备问件
复制链接
|
浏览器收藏
|
打印
亦可追寻
级别: 新手上路
作者资料
发送短消息
加为好友
QQ联系
UID:
42941
精华:
0
发帖:
13
金钱:
65 两
威望:
13 点
综合积分:
26 分
注册时间:
2011-04-12
最后登录:
2014-07-26
楼主
发表于: 2011-10-19 21:09
只看楼主
|
小
中
大
测试测序中的open无法打开设备问件
dev目录下有我创建的设备文件,/proc/devices里能看见。sys/class中也看得见我创建的类,驱动加载成功,make驱动时没有错误。我的驱动和源码如下:
复制代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <asm/irq.h>
#include <mach/gpio.h>
#include <plat/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/hardware.h>
#include <linux/io.h>
#include <asm/uaccess.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("OK6410_V 0.1");
dev_t devno;
static struct cdev cdev_first;
static struct class *firstdrv_class;
volatile unsigned long *gpmcon = NULL;
volatile unsigned long *gpmdat = NULL;
static int first_drv_open(struct inode *inode, struct file *file)
{
/* 配置gpm1-4引脚为输出*/
*gpmcon &= 0xffff0000;
*gpmcon |= 0x00001111;
return 0;
}
static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
int val;
int r;
//printk("first_drv_write\n");
r=copy_from_user(&val, buf, count); // copy_to_user();
if (val == 1)
{
// 点灯
*gpmdat &= 0xfffffff0;
}
else
{
// 灭灯
*gpmdat |= 0xf;
}
return 0;
}
static struct file_operations first_drv_fops ={
.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
.open = first_drv_open,
.write = first_drv_write,
};
static int __init first_drv_init(void)
{
int result;
gpmcon = (volatile unsigned long *)ioremap(0x7f008820, 16);
gpmdat = gpmcon + 1;
printk(KERN_NOTICE "MODULE IS INITING\n");
result=alloc_chrdev_region(&devno,0,1,"myled");
if(result<0)
printk(KERN_NOTICE "region wrong!");
cdev_init(&cdev_first,&first_drv_fops);
cdev_first.owner=THIS_MODULE;
cdev_first.ops=&first_drv_fops;
cdev_add(&cdev_first,devno,1);
firstdrv_class = class_create(THIS_MODULE, "mydrv"); //sys/class
device_create(firstdrv_class, NULL, devno, NULL, "myled"); /* /dev/xyz */
return 0;
}
static void __exit first_drv_exit(void)
{
cdev_del(&cdev_first);
unregister_chrdev_region(devno,1);
device_destroy(firstdrv_class,devno);
class_destroy(firstdrv_class);
iounmap(gpmcon);
printk(KERN_NOTICE "my driver exit\n");
}
module_init(first_drv_init);
module_exit(first_drv_exit);
测试程序:
复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
/* firstdrvtest on
* firstdrvtest off
*/
int main(int argc, char **argv)
{
int fd;
int val = 1;
char *filename="/dev/myled";
fd = open("filename", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
}
if (argc != 2)
{
printf("Usage :\n");
printf("%s <on|off>\n", argv[0]);
return 0;
}
if (strcmp(argv[1], "on") == 0)
{
val = 1;
}
else
{
val = 0;
}
write(fd, &val, 4);
return 0;
}
请高手解答,非常感谢对新手的帮助。
顶端
回复
引用
分享
911gt3
^很多问题的背后都是简单的原因......
级别: 荣誉会员
作者资料
发送短消息
加为好友
UID:
34780
精华:
0
发帖:
1219
金钱:
6230 两
威望:
1246 点
综合积分:
2438 分
注册时间:
2010-12-21
最后登录:
2017-09-18
1楼
发表于: 2011-10-20 09:37
只看该作者
|
小
中
大
下面这一行错了
fd = open("filename", O_RDWR);
顶端
回复
引用
分享
亦可追寻
级别: 新手上路
作者资料
发送短消息
加为好友
QQ联系
UID:
42941
精华:
0
发帖:
13
金钱:
65 两
威望:
13 点
综合积分:
26 分
注册时间:
2011-04-12
最后登录:
2014-07-26
2楼
发表于: 2011-10-20 11:05
只看该作者
|
小
中
大
回 1楼(911gt3) 的帖子
请问我应该怎么改啊?谢谢你的回答了。
我改成fd = open("/dev/myled", O_RDWR);
或fd = open(filename, O_RDWR);
错误都一样啊。
顶端
回复
引用
分享
911gt3
^很多问题的背后都是简单的原因......
级别: 荣誉会员
作者资料
发送短消息
加为好友
UID:
34780
精华:
0
发帖:
1219
金钱:
6230 两
威望:
1246 点
综合积分:
2438 分
注册时间:
2010-12-21
最后登录:
2017-09-18
3楼
发表于: 2011-10-20 11:48
只看该作者
|
小
中
大
1) 加载你的驱动后, 请检查一下 /dev/myled 这个文件是否存在, 不存在的话肯定有问题
2) 你也使用 strerror 这个函数获得open失败时具体的错误原因
顶端
回复
引用
分享
上一主题
下一主题
Linux技术交流区
http://121.40.142.80
访问内容超出本站范围,不能确定是否安全
继续访问
取消访问