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


  • administrators

    大神一出手,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秒。
    0_1493885675511_upload-3fc9fe8b-761f-4af2-ada4-7af394a12b98



  • @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固件么


  • administrators

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


  • administrators

    测试固件,测试结果(官方固件的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