linux注册节点报错,linux驱动错误:no such file or directory

当我们用insmod 加载驱动,然后在应用程中调用open 驱动文件,有时候会出现这个错误:cannot open ***:no such file or directory.

出现这个问题的原因很简单。你执行ls /dev命令看下在设备文件下面是否有你要打开的设备文件名(比如/dev/led),如果没有的话,那么错误的原因就是没有创建设备节点。通过cdev创建的字符设备是不能自动创建设备节点的。这个时候可以使用命令mknod去创建设备节点,如:

mknod  /dev/led  c  253  0(假设的)。

这样再执行自己的应用程序的时候就不会报错了。

另外一种方法,也是我要推荐的方法,就是用udev指令去动态的创建节点,自动创建节点之后每次只要insmod加载模块,应用程序就可以打开设备,而不是每次调试的时候都mknod。方法如下:

static struct class *led_class;

在模块初始化函数:int xxx_init(void)中添加这两句:

led_class = class_create(THIS_MODULE, "led_class");

device_create(led_class, NULL, MKDEV(major, 0), NULL,"led_device");

在模块卸载函数void xxx_exit(void)中添加这两句:

unregister_chrdev(major,"led");

device_destroy(led_class,MKDEV(major, 0));

主要思路:先创建一个类,在类下创建设备!这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过命令:ls /dev可以查看到!

需要注意的是,我们在编写应用程序的时候,open函数里面的设备名字要跟驱动里面device_create指定的设备名字相一致!

<think>我们正在解决tslib报错问题:ts_open: open console device failed: No such file or directory 和 KDSETMODE: Bad file descriptor 根据引用内容,这些问题通常与环境变量配置或设备节点权限有关。我们将逐步分析并解决。 步骤1:确认环境变量设置 引用[1]和[2]都提到了需要正确设置环境变量,特别是: - TSLIB_TSDEVICE:触摸屏设备节点(如/dev/input/event1) - TSLIB_CONFFILE:ts.conf配置文件路径(如/etc/ts.conf) - TSLIB_PLUGINDIR:插件目录(如/lib/ts 或 /usr/lib/ts) - TSLIB_CONSOLEDEVICE:控制台设备(通常设为none,避免与fbdev冲突) - TSLIB_FBDEVICE:帧缓冲设备(如/dev/fb0) 请检查/etc/profile或当前shell的环境变量是否设置正确。例如: export TSLIB_TSDEVICE=/dev/input/event1 # 确保event1是你的触摸屏设备 export TSLIB_CONSOLEDEVICE=none # 避免控制台设备打开失败 export TSLIB_FBDEVICE=/dev/fb0 注意:设备节点可能因系统而异,使用`ls /dev/input/`查看触摸屏设备。 步骤2:检查设备节点是否存在及权限 错误No such file or directory”可能表示设备节点不存在或权限不足。 - 确认设备节点:运行`ls -l /dev/input/event*`,查看触摸屏对应的设备节点- 权限问题:如果使用普通用户运行,确保该用户有访问权限。可临时使用`sudo`或修改设备权限(如`sudo chmod 666 /dev/input/event1`)。 步骤3:检查ts.conf配置文件 - 确保TSLIB_CONFFILE指向的配置文件存在(如/etc/ts.conf)。 - 检查ts.conf内容,通常需要取消注释某个模块(如module_raw input)。 步骤4:关于KDSETMODE: Bad file descriptor错误通常是因为设置了TSLIB_CONSOLEDEVICE,但该设备无法被正确打开或操作。根据引用[1][2],建议将TSLIB_CONSOLEDEVICE设置为none: export TSLIB_CONSOLEDEVICE=none 步骤5:使用sudo时的环境变量传递 引用[3]提到,使用sudo时环境变量可能不会被传递。解决方法: - 使用sudo -E保留当前用户环境变量:`sudo -E ./ts_test` - 或者在sudoers文件中配置`Defaults env_keep += "TSLIB_*"`,然后使用sudo运行。 步骤6:动态库路径问题(引用[4]) - 如果报错涉及动态库,确保tslib的库文件在动态库路径中。可通过设置LD_LIBRARY_PATH环境变量解决: export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # 根据实际安装路径调整 - 或将tslib库所在目录添加到/etc/ld.so.conf,然后运行`ldconfig`。 总结解决方案: 1. 正确设置环境变量(特别是TSLIB_CONSOLEDEVICE=none和TSLIB_TSDEVICE)。 2. 确认设备节点存在且权限正确。 3. 检查ts.conf配置文件。 4. 使用sudo时注意环境变量传递。 5. 确保动态库路径正确。 如果问题依旧,请提供具体操作步骤和错误信息以便进一步排查。 §§相关问题§§ 1. 如何确定触摸屏对应的设备节点? 2. 如何配置sudo以保留特定的环境变量? 3. tslib的ts.conf配置文件应该如何正确配置? 4. 如何设置动态库路径以避免找不到库文件?</think>### 解决 tslib "open console device failed" 和 "KDSETMODE Bad file descriptor" 错误 #### 问题分析 根据引用内容[^1][^2][^3],这些错误通常由以下原因导致: 1. **环境变量配置错误**:`TSLIB_CONSOLEDEVICE` 设置不当 2. **设备节点权限问题**:触摸屏设备节点(如 `/dev/input/event*`)访问受限 3. **配置文件缺失**:`ts.conf` 文件路径错误或不存在 4. **sudo 权限问题**:使用 `sudo` 时环境变量未正确传递 #### 解决方案 ##### 1. 修正环境变量配置(关键步骤) 在 `/etc/profile` 中添加以下配置(根据实际设备调整): ```bash # 确保控制台设备设置为 none export TSLIB_CONSOLEDEVICE=none # 其他必要配置 export TSLIB_TSDEVICE=/dev/input/event1 # 确认实际触摸屏设备节点 export TSLIB_CONFFILE=/etc/ts.conf # 确认文件存在 export TSLIB_PLUGINDIR=/lib/ts # 或 /usr/lib/ts export TSLIB_FBDEVICE=/dev/fb0 # 帧缓冲设备 export TSLIB_CALIBFILE=/etc/pointercal # 校准文件 ``` **重点**:`TSLIB_CONSOLEDEVICE=none` 可解决 `KDSETMODE` 错误[^1][^2] ##### 2. 验证设备节点权限 ```bash # 查看触摸屏设备节点 ls /dev/input/event* # 添加读写权限(临时方案) sudo chmod 666 /dev/input/event1 # 永久方案:创建 udev 规则 echo 'KERNEL=="event1", MODE="0666"' | sudo tee /etc/udev/rules.d/99-touchscreen.rules sudo udevadm control --reload ``` ##### 3. 检查配置文件 ```bash # 确认配置文件存在 ls /etc/ts.conf # 若文件缺失,从 tslib 源码复制 sudo cp /path/to/tslib-source/etc/ts.conf /etc/ ``` ##### 4. 解决 sudo 环境问题 ```bash # 方法1:使用 -E 继承环境变量 sudo -E ./ts_test # 方法2:在 sudoers 中保留环境变量 sudo visudo # 添加以下内容: Defaults env_keep += "TSLIB_*" ``` ##### 5. 验证动态库路径(引用[^4]) ```bash # 检查库依赖 ldd $(which ts_test) # 添加库路径 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ``` #### 验证步骤 ```bash # 重新加载配置 source /etc/profile # 运行校准测试 ts_calibrate # 普通用户 sudo -E ts_calibrate # 需要特权时 ``` #### 常见错误排查 | 错误现象 | 解决方案 | |---------|---------| | `open console device failed` | 确保 `TSLIB_CONSOLEDEVICE=none` | | `No such file or directory` | 检查 `TSLIB_TSDEVICE` 路径和权限 | | `Bad file descriptor` | 禁用控制台设备(`none`设置) | | `ts_config: No such file` | 验证 `TSLIB_CONFFILE` 指向的 `ts.conf` | > **重要提示**:嵌入式设备需确保 `tslib` 已正确交叉编译,且文件系统包含所有依赖库[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值