32M Widora环境下MRAA库交叉编译
-
最近试着把16M widora环境下的mraa库文件复制到32M widora环境下,发现调用库时发生segmentation fault错误! 折腾
了好一阵,在网上查了一堆资料,乱冲乱撞地查看代码,居然有所发现,最后终于将mraa库文件在32M widora环境下 交叉编译
成功! 现将过程分享如下:
1. git clone https://github.com/sergev/mraa 下载代码, 此处MRAA源码支持MT7688 mips架构。
2. 修改 mraa下CMakeLists.txt文件,增加如下SET设置 (相应的目录请根据自己环境配置设定):
cmake_minimum_required (VERSION 2.8) project (mraa C) #---- for cross compile ------ SET (CMAKE_SYSTEM_NAME Linux) SET (CMAKE_SYSTEM_PROCESSOR MIPS) (好像不必要!!!) SET (TOOLCHAIN_DIR "/home/midas/openwrt_widora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2") SET (CMAKE_FIND_ROOT_PATH "/home/midas/openwrt_widora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2") SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET (CMAKE_C_COMPILER "/home/midas/openwrt_widora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc") SET (CMAKE_CXX_COMPILER "/home/midas/openwrt_widora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-g++") #set(SWIG_EXECUTABLE "/usr/bin/swig") set(SWIG_DIR "/usr/bin/swig") FIND_PACKAGE (Threads REQUIRED) ... ...
3. 修改 mraa/src/mips/mips.c 文件, 注释掉if部分,增加一句 platform_type = MRAA_MTK_LINKIT;
/*
if (fh != NULL) {
... ...
... ...
}
free(line);
*/
platform_type = MRAA_MTK_LINKIT;
... ...4. 修改 mraa/cmake_install.cmake文件,设置安装位置.
... ...#-------- Set the install prefix --------------- IF(NOT DEFINED CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX "/home/midas/mraa/build") (设置编译生成文件存放的位置) ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") ... ...
5. 在mraa目录下执行cmake . (注意后面有一点)
6. 在mraa目录下执行make, 如果只需要libmraa.so库,那么执行到Linking C shared library libmraa.so时就ok了.
7. 在mraa目录下执行make install, 在mraa/build位置生成include, lib 和 share 文件夹,存放着相应的头文件和库文件。其中 share/mraa/exampels 下面有库的各种应用例子,很有参考价值
-
大神一出手,bug全溜走!
-
请问,我在7688中opkg install python libmraa 后,用python编写7688GPIO控制,但是运行是错误。请问是哪方面出了问题?
#!/usr/bin/python
import mraa
import time
print(mraa.getVersion())
mraa.init()pin = mraa.Gpio(42)
pin.dir(mraa.DIR_OUT)
while True:
pin.write(1)
time.sleep(1)
pin.write(0)
time.sleep(1)
运行后提示:
v0.8.0
Traceback (most recent call last):
File "gpio.py", line 7, in <module>
pin = mraa.Gpio(42)
File "/usr/lib/python2.7/site-packages/mraa.py", line 820, in init
this = _mraa.new_Gpio(pin, owner, raw)
ValueError: Invalid GPIO pin specified
-
把pin = mraa.Gpio(42) 句改成 pin = mraa.Gpio(42,owner=False,raw=True) 就OK了。
用你的代码试验了一下,暗1秒亮1秒。
-
@midas-zhou said in 32M Widora环境下MRAA库交叉编译:
pin = mraa.Gpio(42,owner=False,raw=True)
MRAA默认owner=Ture,raw=False;现改成owner=False,raw=True,就可以了。可不可以说说理由。初学,很多不懂。
-
@mypear 这个我也搞不清楚,Owner=True可能和Openwrt的GPIO相关驱动有冲突。
-
MTK 7688官方板子使用默认就OK,是不是底层或mraa有修改过。有研究MTK7688固件么
-
@mypear 稍后我看一下他们调用的哪套代码。
-
测试固件,测试结果(官方固件的MRAA功能也不正常?):
https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/downloads
lks7688.img,0.9.4
测试程序:
固件内路径/IoT/examples/blink-gpio44.py
直接运行,可以看到WLED在闪,正常。
接下来改到其他GPIO上,例如39,
运行结果:root@mylinkit:/IoT/examples# ./blink-gpio44.py Traceback (most recent call last): File "./blink-gpio44.py", line 6, in <module> x = mraa.Gpio(39) File "/usr/lib/python2.7/site-packages/mraa.py", line 820, in __init__ this = _mraa.new_Gpio(pin, owner, raw) ValueError: Invalid GPIO pin specified
怀疑和导出IO有关,所以查看/sys/class/gpio/目录,主动导出echo 39 > export后再运行blink-gpio.py。
发现错误依旧。
-
调用mraa C库来操作PWM是可以的。https://github.com/widora/ctest/blob/master/pwmtest_32M.c