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 下面有库的各种应用例子,很有参考价值

调用mraa C库来操作PWM是可以的。https://github.com/widora/ctest/blob/master/pwmtest_32M.c

测试固件,测试结果(官方固件的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。
发现错误依旧。

@mypear 稍后我看一下他们调用的哪套代码。

MTK 7688官方板子使用默认就OK,是不是底层或mraa有修改过。有研究MTK7688固件么

@mypear 这个我也搞不清楚,Owner=True可能和Openwrt的GPIO相关驱动有冲突。

@midas-zhou said in 32M Widora环境下MRAA库交叉编译:

pin = mraa.Gpio(42,owner=False,raw=True)

MRAA默认owner=Ture,raw=False;现改成owner=False,raw=True,就可以了。可不可以说说理由。初学,很多不懂。

把pin = mraa.Gpio(42) 句改成 pin = mraa.Gpio(42,owner=False,raw=True) 就OK了。
用你的代码试验了一下,暗1秒亮1秒。
0_1493885675511_upload-3fc9fe8b-761f-4af2-ada4-7af394a12b98

请问,我在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
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

大神一出手,bug全溜走!