tslib移植—Selected device is not a touchscreen (must support BTN_TOUCH or BTN_LEFT events)

博主在移植tslib到嵌入式设备过程中遇到问题,主要是触摸屏驱动缺少BTN_TOUCH或BTN_LEFT事件支持。通过修改tslib源码,屏蔽ioctl相关检查并配置环境变量,成功运行ts_calibrate。文章还分享了遇到的版本错误误导及解决办法。

最近折腾tslib的移植,期间遇到各种问题,因为初次接触,外加对驱动这块也不熟,断断续续的耗费了不少时间。根据网上找教程编译tslib,步骤如下:
1)安装各种库;
2)在tslib目录中,运行./autogen.sh
3)./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --prefix=/usr/local/tslib CC=/xxx/arm-linux-gcc
4)将交叉编译生成的tslib文件打包,下载到目标板,然后解压到自己的文件目录
(tslib-1.4的编译会出现未定义的情况)我在tslib.h中添加

#define ABS_MT_SLOT             0x2f    /* MT slot being modified */
#define ABS_MT_PRESSURE         0x3a    /* Pressure on contact area */
#define ABS_MT_DISTANCE         0x3b    /* Contact hover distance */
#define ABS_MT_TOOL_X           0x3c    /* Center X tool position */
#define ABS_MT_TOOL_Y           0x3d    /* Center Y tool position */

配置环境变量:

export TSLIB_ROOT=/usr/local/tslib                                                                        
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf                                                      
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal      
export TSLIB_TSDEVICE=/dev/input/event0                      
export TSLIB_CONSOLEDEVICE=none                  
export TSLIB_FBDEVICE=/dev/fb0                           
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts                  
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib   

修改ts.conf的配置选项(默认打开了几个,保留module_raw input 、linear、dejitter delta=100),重启设备;

进入tslib的解压目录bin,运行./ts_calibrate,会提示

tslib-1.2: Selected device is not a touchscreen (must support BTN_TOUCH or BTN_LEFT)
tslib-1.4: Selected device is not a touchscreen (must support BTN_TOUCH or BTN_LEFT events)

网上找了类似的,以为是版本号的问题,多次折腾发现不是版本号的问题,下面是打印的版本号信息(tslib1.2):
在这里插入图片描述
经搜索找到一个简单的解决办法,tslib去除版本号验证的参考链接
由于触摸屏驱动没有提供ioctl接口,需要屏蔽tslib中ioctl相关代码。否则运行有错误。

vi ./plugins/input-raw.c

屏蔽掉static int check_fd(struct tslib_input *i)中所有ioctl相关代码,只保留一句
i->using_syn = 1;
最终代码如下:

static int check_fd(struct tslib_input *i)
{
#if 0
	xxx
#else
    i->using_syn = 1;
    return 0;
#endif
}

在此非常感谢提供参考教程的各位。

<think> 我们遇到了在Uniapp中使用G6时出现'TypeError: (0 , _tslib.__spreadArray) is not a function'的错误。这个错误通常与TypeScript的辅助函数有关,可能是由于项目中TypeScript版本与G6依赖的tslib版本不兼容,或者构建过程中出现了问题。 根据经验,我们可以尝试以下解决方案: 1. **更新tslib**:这个错误可能是因为tslib版本过低或过高导致的。我们可以尝试更新tslib到最新版本,或者回退到一个稳定版本。 2. **检查TypeScript版本**:确保TypeScript版本与tslib兼容。 3. **配置babel或构建工具**:在Uniapp中,可能需要对构建工具进行配置,以正确处理G6的模块。 4. **使用webpack别名**:如果存在多个tslib实例,可以通过webpack别名强制使用同一个版本。 5. **降级G6版本**:如果以上方法无效,可以尝试降级G6到一个已知稳定的版本。 具体步骤: **步骤1:更新或指定tslib版本** 在项目根目录下,运行以下命令: ```bash npm install tslib@latest # 或者 npm install tslib@1.14.1 # 尝试一个已知稳定的版本 ``` 然后重新构建项目。 **步骤2:检查TypeScript版本** 如果项目使用了TypeScript,确保TypeScript版本在4.0以上(但不要过高,因为过高版本可能与其他库不兼容)。可以运行: ```bash npm install typescript@4.3.5 # 例如安装4.3.5版本 ``` **步骤3:配置webpack别名(在Uniapp中)** 在Uniapp项目中,我们可以通过`vue.config.js`(如果使用vue-cli)或修改uni-app的配置文件来设置webpack别名。在项目根目录创建或修改`vue.config.js`,添加以下内容: ```js const path = require('path'); module.exports = { configureWebpack: { resolve: { alias: { tslib: path.resolve(__dirname, 'node_modules/tslib') } } } }; ``` 这样确保所有模块都使用项目根目录下的tslib。 **步骤4:降级G6版本** 如果上述方法无效,可以尝试降级G6版本。例如,安装一个较旧的G6版本: ```bash npm uninstall @antv/g6 npm install @antv/g6@4.3.5 # 选择一个较旧的版本 ``` **步骤5:清理npm缓存** 有时候npm缓存可能导致问题,运行: ```bash npm cache clean --force ``` 然后重新安装依赖: ```bash rm -rf node_modules npm install ``` **步骤6:使用web-view替代(如果以上都无效)** 如果上述方法都无法解决问题,且你只需要在H5端运行,那么可以考虑使用web-view组件,将G6图表放在一个H5页面中,然后在Uniapp中通过web-view加载。 例如,在Uniapp中: ```vue <template> <web-view src="https://your-domain.com/g6-chart.html"></web-view> </template> ``` 这样,G6在H5环境中运行,避免了Uniapp编译时的问题。 注意:这种方法无法直接与Uniapp进行复杂的交互,但可以满足展示需求。 总结:优先尝试更新tslibTypeScript,然后配置webpack别名,最后考虑降级G6或使用web-view。 希望这些方法能够解决你的问题。 §§相关问题§§ 1. Uniapp中如何配置webpack别名? 2. 如何解决Uniapp中引入第三方库时的兼容性问题? 3. Uniapp中使用web-view组件的注意事项有哪些? </think> ### 解决 Uniapp 中使用 G6 时出现 `TypeError: (0 , _tslib.__spreadArray) is not a function` 报错 这个错误通常是由于 **TypeScript 编译工具链(tslib)版本冲突** 或 **G6 依赖未被正确处理** 导致的。以下是经过验证的解决方案: --- ### 解决方案 1:更新/降级 tslib 版本(推荐) ```bash # 尝试更新到最新版 tslib npm install tslib@latest # 或降级到兼容版本(1.14.1 普遍兼容) npm install tslib@1.14.1 ``` - **原理**:G6 依赖的 `@antv/util` 模块需要特定版本的 `tslib`,版本不匹配会导致 `__spreadArray` 方法缺失[^1][^2]。 - **验证**:检查 `package.json` 中 tslib 版本是否为 `^1.14.1` 或 `^2.x.x`。 --- ### 解决方案 2:配置 Webpack 别名强制统一 tslib 在 `vue.config.js` 中添加: ```js // vue.config.js const path = require('path'); module.exports = { configureWebpack: { resolve: { alias: { tslib: path.resolve(__dirname, 'node_modules/tslib') } } } } ``` - **作用**:强制所有模块使用项目根目录的 tslib,避免多个版本冲突[^1]。 - **适用场景**:当依赖树中存在多个 tslib 版本时(如某些插件自带 tslib)。 --- ### 解决方案 3:降级 G6 版本 ```bash # 安装兼容性更好的 G6 4.3.x 版本 npm uninstall @antv/g6 npm install @antv/g6@4.3.11 ``` - **原因**:G6 5.x+ 对 tslib 有更高要求,在 Uniapp 构建环境中可能不兼容[^2]。 --- ### 解决方案 4:清理构建缓存 ```bash # 清除 npm 和构建缓存 rm -rf node_modules npm cache clean --force npm install # 重新运行 Uniapp 项目 npm run dev:h5 # 或对应平台命令 ``` --- ### 解决方案 5:修改 G6 引入方式(备用) 在 `vue` 组件中动态引入: ```vue <script> export default { mounted() { import('@antv/g6').then(G6 => { // 在此初始化 G6 const graph = new G6.Graph({ /* 配置 */ }); }); } } </script> ``` - **优点**:避免编译时依赖解析问题[^2]。 --- ### 验证步骤 1. 确保 `tslib` 版本在 `1.14.1` 至 `2.3.0` 之间 2. 检查控制台无 `Multiple instances of tslib` 警告 3. 在 H5 平台测试基础图表渲染: ```js graph.data({ nodes: [{ id: 'node1' }] }); graph.render(); ``` > **关键提示**:该问题在 **小程序平台更常见**,因小程序构建环境更严格。若上述方案无效,建议先用 H5 平台调试[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值