精华内容
下载资源
问答
  • openwrt 环境搭建

    2018-12-24 16:55:36
    openwrt编译环境搭建。
  • OpenWrt环境下编译fcgiwrap的源代码,内含其所依赖的fcgi包源代码,将文件 解压到OpenWrt-SDK的package目录下即可执行Make V=s完成整个编译过程,生成的ipk文件可直接安装到相应的路由器中,然后就可以用nginx取代原...
  • 如何在OpenWRT环境下做开发_Bargen20150417
  • openwrt 环境搭建(win10子系统)

    千次阅读 2020-08-07 15:29:00
    openwrt开发总结(一) openwrt环境搭建(win10子系统) 因为工作需要,我一个安卓程序开发,做了很多关于openwrt相关的内容,也不说喜不喜欢吧,反正应该对得起自己的工资。废话不多说,进入主题吧! 前面我写了一篇...

    因为工作需要,我一个安卓程序开发,做了很多关于openwrt相关的内容,也不说喜不喜欢吧,反正应该对得起自己的工资。废话不多说,进入主题吧!

    前面我写了一篇在Windows10上搭建Ubuntu子系统的博文,虽然自己看都觉得写的不是很好,还是应该能用,也希望假借多写博客,提高自己的写作水平吧!接下来,本篇博客将就使用win10上的Ubuntu搭建openwrt环境进行开发,当然如果你使用的是虚拟机,也可以借鉴借鉴,还没那么多麻烦,只可惜我的笔记本电脑性能有限,使用虚拟机卡的不行。

    搭建Windows10子系统

    这个就不多说了,请看我的另一篇博客:

    教你如何在Win10上利用子系统运行Ubuntu & 处理代码

    子系统位置

    安装的Ubuntu的位置就在系统的软件appdata目录里面,如果没改的话就在C盘了,例如我的就在下面的目录,可以创建一个快捷方式便于访问。

    C:\Users\user\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
    

    访问本地文件

    可以在Ubuntu的 /mnt/ 文件夹下访问 Windows 的文件目录,使用 gcc 什么的都是没问题的。也可以使用一个符号链接,把需要使用的目录放到 ~ 目录下:

    #可以看到像C盘、D盘之类的
    ls /mnt/	
    #使用软链接做快捷方式
    ln -s 源文件 目标文件
    

    下载openwrt安装包

    如果不需要什么特别的东西的话,直接从GitHub上下载源码吧!

    我使用的是联发科的一款芯片(MT7628 + MT7612e),用的是特别版的SDK。这个SDK好久没更新了,网上应该都能找到(就是20160324那个),如果说和原版有什么不同的话,应该就是加了点芯片的驱动,具体我也就就没深究了。

    安装依赖库

    编译openwrt源码需要用到很多库,在Ubuntu上输入

    sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler
    

    我这也是从网上复制的,如果却什么库,后面看报错再补。

    有的说要安装openjdk-8-jdk这个包会,并且会安装失败,这种情况在15版本以下的Ubuntu中会出现,有需要的话看看这个博客吧!

    编译固件

    接下来就是重头戏了,也是比较复杂的部分,很多博客强烈建议使用非root用户编译,还说别用git,我是发现用Ubuntu没什么问题,安装好给的就不是root账户(输入行前是$符就是非root,如果是#就是root账户了)。所以我们不需要管这些,直接编译的去就好。

    如果你看了我之前的博客,应该注意在设置用户名和密码的时候不能关闭窗口,如果关了那后面就是root用户登录了,这样就会出问题,可以手动添加用户和设置默认登录账户或者重置、重装子系统解决。

    首先更新脚本

    在编译之前先更新下脚本吧,意思应该是让编译过程知道去哪里下载需要的文件。从这步开始都需要将终端路径定位到openwrt的根目录下。在openwrt目录下执行下列命令:

    ./scripts/feeds update -a && ./scripts/feeds install -a
    

    打开menu菜单

    更新完脚本后,就是编译固件了,输入make menuconfig命令(可以先预下载,看下面代码),让它自动下载需要的文件,这个需要等待很长时间,而且可能因为网络问题,很多东西下不下来。解决的办法就是从别人下好的dl文件夹下面,把内容都复制过来,要是别人都没有的话,还可以通过谷歌(百度不好用)搜这个包,一般都能从网上下,丢到dl文件夹里面就好。可能会出现各种问题,后面另起一章。

    make menuconfig
    #如果需要的话,还可以编译内核模块
    make kernel_menuconfig
    #清空编译,最好别试,除非有问题
    make clean
    
    make download -j4 V=s#预下载编译所需的软件包,j后面是线程数,按自己的改吧
    
    #检查文件完整性,避免错误,提高编译成功率
    find dl -size -1024c -exec ls -l {} \;#列出小于1k的文件
    find dl -size -1024c -exec rm -f {} \;#删除小于1k的文件
    

    东西下载好了后,会打开一个用于选择参数的图形界面,就可以配置需要的各种功能模块了。

    编译刷机固件

    选择好menu里面需要的库后,输入make V=s就可以编译固件了,这个也需要很长时间,也会出一些问题,后面解答。下面是一些编译的命令,当然也可以去看 官方说明 ,详细点

    make V=s	#输出详细的debug信息
    make V=99	#功能同上
    make -j n	#使用n个CPU内核编译,可以和V=s一起使用
    
    #只编译某个模块
    make package/xxx/clean		//清除模块,有时候编译抽风需要清一下
    make package/xxx/compile	//编译模块
    make package/xxx/install
    

    出现问题

    文件目录大小写不敏感

    #运行下面代码是出问题
    ./scripts/feeds update -a
    
    #提示如下
    Build dependency: OpenWrt can only be built on a case-sensitive filesystem
    

    这个是因为Windows对大小写不支持的原因,而 Linux 子系统里面区分大小写,直接运行在 Windows 目录下面的代码会出问题。

    网上说使用 fsutil.exe file setCaseSensitiveInfo enable 可以设置大小写敏感,但是已经存在的文件不会生效,可能要从其他盘符复制过去,我试了好像不太好用,可能没用对。

    我还是通过直接复制openwrt源码到Ubuntu里面去,问题完事。不过中间也犯了几个错误:

    错误一:直接复制到 / 目录,编译出问题
    错误二:复制到 home 目录,编译继续出错
    

    最后还是复制到了 ~ 目录,即 /home/user/ 目录下,编译就没问题了。其实直接复制到 tmp 目录也是可以的。

    使用PERL脚本版本问题

    Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at /home/li/OS/IBSS/IBSS-openwrt.git/staging_dir/host/bin/automake line 4160.
    

    这个问题我也不太清楚,但是使用子系统编译必出这个问题。查阅资料说是因为新版的perl不再支持左大括号的使用,是staging_dir/host/bin/automake的4160行报错,解决办法也很简单:

    vim staging_dir/host/bin/automake +4160
    

    把这行的大括号全部删除就行,具体为什么别问我,我也不会。

    缺失版本号

    如果用了别人的dl文件夹下的文件,编译时候会出现如下这种错误:

    cat: openwrt-sdk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/base-files/ipkg-ramips_24kec/base-files/etc/sdk.version
    

    问题是因为少复制了版本号,大致是以下几个位置:

    ./target/linux/ramips/base-files/etc/sdk.version
    ./staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/root-ramips/etc/sdk.version
    ./build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/base-files/ipkg-ramips_24kec/base-files/etc/sdk.version
    ./build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/root-ramips/etc/sdk.version
    

    使用 vim 在这几个位置新建名为 sdk.version 的文件,内容填入 V1.0.0 就好,保存后编译就行了。实际上我试过,这几个目录里面应该是有一个生效的,如果缺了重要的那个,保存好一编译其他几个就丢了,所以把四个文件都添上吧!

    下载文件不完整

    make[3]: Entering directory `/home/admin/openwrt/lede/package/lean/openwrt-fullconenat'
    touch /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.prepared_c3d2744078ea94ecfd6014d7d4b9070a_6664517399ebbbc92a37c5bb081b5c53_check. /home/admin/openwrt/lede/include/shell.sh; xzcat /home/admin/openwrt/lede/dl/fullconenat-2018-12-15-d4daedd0.tar.xz | tar -C /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.. -xf -
    tar: This does not look like a tar archive
    tar: Exiting with failure status due to previous errors
    

    因为网络问题,文件可能会下载出错,如果文件出错了,用到这个文件就make不过去,在dl文件夹下把这文件删了就行。也可以用上面检查文件完整性代码,是网上别人写的,意思是小于1k的文件基本不完整,删掉就好。

    缺失依赖库

    如果按上面安装依赖库安装的话,应该是问题不大,如果提示像下面语句,那就是缺失依赖库了,装上就好(如果不知道安装哪个包,直接谷歌搜缺的库吧)。

    Build dependency: Please install the openssl library (with development headers)
    

    未连接互联网

    make -r world: build failed. Please re-run make with -j1 V=s to see what's going on
    

    openwrt编译过程需要下载文件,需要连接互联网,当然如果dl里面都有,脚本没更新应该就不用了。

    使用root账户出错

    Build dependency: Please do not compile as root.
    

    按上面流程的话,应该没这个问题。如果遇到了,那就先改变文件的权限 ,使用 su 命令切换用户,再编译。

    如果实在看不习惯openwrt这种操作的话,也可以暴力修改,方法如下:

    vi include/prereq-build.mk
    #直接把下面这行注释了
    [ "$$(shell whoami)" != "root" ]
    

    保存后再次运行make menuconfig,就自由自在了。

    文件权限问题

    "\home\user\openwrt-sdk\package\argserver": Permission denied
    

    如果从Windows系统更改了文件,并且保存了,编译的时候就会出现编译的权限问题,可以更改文件权限

    chmod -R 777 package\argserver #更改目录权限,并迭代
    

    更多问题解决

    还有其他问题的话,可以参考这篇 博客,我这是没出这么多问题的!

    举例举例

    我这有一个MT7628 + MT7612e的板子,厂商就不说了,现在就用这个说说menu的配置吧!

    在图形界面里面通过按空格勾选内容,* 号就表示选通过中,按左右键可以在底部命令滑动,按enter键确定底部的命令,按 / 符号可以进行搜索,标题英文说的挺好,看看吧!

    设定目标芯片

    在make menuconfig后,在第一页设置好前三栏,选择对于的芯片平台。

    设定目标芯片

    勾选驱动

    在 MTK Properties-> Drivers 里面将 kmod-mt7628 和 kmod-mt76x2e 添加上。

    勾选对应驱动

    需要注意的是,对后面有箭头的项目还能点进去设置参数,kmod-mt7628进去就是下面内容:

    kmod-mt7628

    其实这几张图片都是从别人那拿的,有兴趣可以看看这个博客。下面是上面两个栏的配置,可以参考一下,具体内容按自己需要吧!

    基本参数

    模式设置

    刷机

    在上面配置好menu后使用make V=s生成固件就可以刷机了,固件的位置在下面这个目录

    openwrt-sdk\bin\ramips\openwrt-ramips-mt7628-mt7628-squashfs-sysupgrade.bin
    

    可以通过串口或者从网页就可以完成刷机了,应该很简单,不多说了。

    安装程序

    openwrt也可以像安卓手机一样,通过一个ipk文件安装程序,可以在menu里面把sftp打开:

    Network -> SSH -> openssh-sftp-server. OpenSSH SFTP server
    

    编译固件刷上,就能够使用 SecureFX / WinSCP 这样的软件复制东西到板卡里面去,一般复制到 /tmp/ 目录下,使用命令可以进行软件安装:

    opkg install xxx.ipk
    
    opkg update #更新可以获取的软件包列表
    opkg upgrade #对已经安装的软件包升级
    opkg list #获取软件列表
    opkg install #安装指定的软件包
    opkg remove #卸载已经安装的指定的软件包
    
    

    需要注意的是,放在 /tmp/ 目录下的东西路由器重启后会删除,其他就没什么了。

    展开全文
  • OpenWRT环境下做开发

    2013-12-26 14:33:30
    【整理】如何在OpenWRT环境下做开发 之前写过一篇日志,是关于如何搭建自己的OpenWRT开发环境。经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解。在这里将我的开发心得做个整理。 1...

    【整理】如何在OpenWRT环境下做开发

    之前写过一篇日志,是关于如何搭建自己的OpenWRT开发环境。经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解。在这里将我的开发心得做个整理。

    1、搭建开发环境
    首先,我们需要一个为路由器定制的开发环境,具体可以参考我的另一篇日志:《搭建自己的OpenWrt开发环境》。这里只做一个简单的补充,在执行make menuconfig后,会出现下图:


    其中,图中红框部分是我定制路由器的系统版本,大家可以根据不同的路由器进行不同的选择;绿框部分表示我们需要编译一个SDK开发环境(默认情况下,此项未勾选)。

    编译过程中需要通过官网下载很多相关的软件包,所以必须保证能够顺利连上外网。由于下载速度的限制,编译过程大概需要数小时。编译结束后,所有的产品都会放在编译根目录下的bin/yourtarget/. 例如:我所编译的产物都放在./bin/brcm47xx/下,其中文件主要有几类:

    (1).bin/.trx 文件: 这些都是在我们所选的target-system的类别之下,针对不同路由器型号、版本编译的路由器固件。这些不同路由器的型号和版本是openwrt预先设置好的,我们不需要更改。至于.bin和.trx的区别,一种说法是,第一次刷路由器的时候,需要用.bin文件,如果需要再升级,则不能再使用.bin文件,而需要用.trx文件。原因是,.bin是将路由器的相关配置信息和.trx封装在一起而生成的封包,也就是说是包含路由器版本信息的.trx。在第一次刷固件的时候,我们需要提供这样的信息,而在后续升级时,则不再需要,用.trx文件即可。

    (2)packages文件夹: 里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。

    (3)OpenWrt-SDK.**.tar.bz2:  这个也就是我们定制编译好的OpenWRT SDK环境。我们将用这个来进行OpenWrt软件包的开发。例如,我所编译好的SDK环境包为:/bin/brcm47xx/OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2
    可以从名称上看出,target system是brcm47xx,host system是Linux-x86_64,使用的编译工具以及库是4.3.3+cs_uClibc-0.9.30.1。

    (4)md5sums 文件: 这个文件记录了所有我们编译好的文件的MD5值,来保证文件的完整性。因为文件的不完整,很容易将路由器变成“砖头”。

    需要主要的是,编译完成后,一定要将编译好的bin目录进行备份(如果里面东西对你很重要的话),因为在下次编译之前,执行make clean 会将bin目录下的所有文件给清除掉!!

    2、 更改原有packages

    在编译根目录下会有一个dl的目录,这个目录其实是“download”的简写,在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。
    当然,你也可以自己在dl里面创建自己的软件包,然后更改相关的配置文件,让openwrt可以识别这个文件包。

    由于我的项目更改的内容是底层的,需要跟固件一起安装。所以,我使用的方法就是直接更改dl目录下软件包,然后重新进行固件编译。感觉类似于Linux的内核编译。反复编过十多次,没有任何问题。

    3、 新建自己的packages
    对于自己新建的package,而这个package又不需要随固件一起安装,换句话说,就是可以当做一个可选软件包的话。我们可以利用我们的SDK环境来单独编译,编译后会生成一个ipk的文件包。然后利用 opkg install xxx.ipk 来安装这个软件。

    下面具体说下,如何编译一个helloword的软件包。
    (1)首先,编写helloworld程序
    编写helloworld.c
    /****************
    * Helloworld.c
    * The most simplistic C program ever written.
    * An epileptic monkey on crack could write this code.
    *****************/

    #include <stdio.h>
    #include <unistd.h>
    int main(void)
    {
         printf("Hell! O' world, why won't my code compile?\n\n");
         return 0;
    }

    编写Makefile文件
    # build helloworld executable when user executes "make"

    helloworld: helloworld.o
            $(CC) $(LDFLAGS) helloworld.o -o helloworld

    helloworld.o: helloworld.c
            $(CC) $(CFLAGS) -c helloworld.c

    # remove object files and executable when user executes "make clean"
    clean:
            rm *.o helloworld
                                      
    在这两个文件的目录下,执行make 应该可以生成helloworld的可执行文件。执行helloworld后,能够打印出“Hell! O' world, why won't my code compile?”。 这一步,主要保证我们的源程序是可以正常编译的。下面我们将其移植到OpenWRT上。

    (2)将OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2解压
    tar –xvf OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2

    (3)进入SDK
    cd OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1
    可以看到里面的目录结构跟我们之前source的目录结构基本相同,所需要编译的软件包,需要放置在package目录下

    (4)在package目录下创建helloworld目录
    cd package
    mkdir helloworld
    cd helloworld

    (5)创建src目录,拷贝 helloworld文件
    mkdir src
    cp /home/wrt/test/helloworld.c src
    cp /home/wrt/test/Makefile src

    (6)在helloworld目录下创建Makefile文件
    这个Makefile文件是给OpenWRT读的,而之前写的那个Makefile文件是针对helloworld给编译其读的。两个Makefile不在同一层目录下。

    touch Makefile
    vim Makefile

    Makefile文件模板内容如下:
    ##############################################
    # OpenWrt Makefile for helloworld program
    #
    #
    # Most of the variables used here are defined in
    # the include directives below. We just need to
    # specify a basic description of the package,
    # where to build our program, where to find
    # the source files, and where to install the
    # compiled program on the router.
    #
    # Be very careful of spacing in this file.
    # Indents should be tabs, not spaces, and
    # there should be no trailing whitespace in
    # lines that are not commented.
    #
    ##############################################

    include $(TOPDIR)/rules.mk

    # Name and release number of this package
    PKG_NAME:=helloworld
    PKG_RELEASE:=1


    # This specifies the directory where we're going to build the program. 
    # The root build directory, $(BUILD_DIR), is by default the build_mipsel
    # directory in your OpenWrt SDK directory
    PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)


    include $(INCLUDE_DIR)/package.mk

     

    # Specify package information for this program.
    # The variables defined here should be self explanatory.
    # If you are running Kamikaze, delete the DESCRIPTION
    # variable below and uncomment the Kamikaze define
    # directive for the description below
    define Package/helloworld
            SECTION:=utils
            CATEGORY:=Utilities
            TITLE:=Helloworld -- prints a snarky message
    endef


    # Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
    define Package/helloworld/description
            If you can't figure out what this program does, you're probably
            brain-dead and need immediate medical attention.
    endef

     

    # Specify what needs to be done to prepare for building the package.
    # In our case, we need to copy the source files to the build directory.
    # This is NOT the default.  The default uses the PKG_SOURCE_URL and the
    # PKG_SOURCE which is not defined here to download the source from the web.
    # In order to just build a simple program that we have just written, it is
    # much easier to do it this way.
    define Build/Prepare
            mkdir -p $(PKG_BUILD_DIR)
            $(CP) ./src/* $(PKG_BUILD_DIR)/
    endef


    # We do not need to define Build/Configure or Build/Compile directives
    # The defaults are appropriate for compiling a simple program such as this one


    # Specify where and how to install the program. Since we only have one file,
    # the helloworld executable, install it by copying it to the /bin directory on
    # the router. The $(1) variable represents the root directory on the router running
    # OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install
    # directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the
    # command to copy the binary file from its current location (in our case the build
    # directory) to the install directory.
    define Package/helloworld/install
            $(INSTALL_DIR) $(1)/bin
            $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
    endef


    # This line executes the necessary commands to compile our program.
    # The above define directives specify all the information needed, but this
    # line calls BuildPackage which in turn actually uses this information to
    # build a package.
    $(eval $(call BuildPackage,helloworld))


    (7)返回到SDK的根目录
    执行make进行编译
    编译过程会在build_dir目录下完成
    编译结果会放在 bin/[yourtarget]/package目录下helloworld_1_bcm47xx.ipk

    (8)上传helloworld_1_bcm47xx.ipk
    使用sftp软件上传helloworld_1_bcm47xx.ipk至路由器
    执行 opkg install helloworld_1_bcm47xx.ipk
    输入hello然后按Tab键,发现openwrt中已经有helloworld可执行命令。
    执行 helloworld 查看程序的效果。

    Hell! O' world, why won't my code compile?

    【End】

    希望对大家能有帮助 :)

    -----------------------------------------------------------

    展开全文
  • Openwrt环境下I2C操作

    千次阅读 2014-11-09 12:21:45
    一、 环境介绍 软件环境:openwrt稳定发行版 barrier_breaker ...本文主要介绍,在openwrt环境下使用mt7620n芯片内置i2c模块操作eeprom 的方法。 二、 添加内核支持 #cd barrier_breaker/ #makemenuconfig

    一、          环境介绍

    软件环境:openwrt稳定发行版 barrier_breaker

    硬件环境:主控芯片 MT7620n   eeprom 24c02

     

    本文主要介绍,在openwrt环境下使用mt7620n芯片内置i2c模块操作eeprom

    的方法。

    二、          添加内核支持

    #cd  barrier_breaker/

    #makemenuconfig

    Kernelmodules --->

    I2Csupport --->

    <*>kmod-i2c-core

    <*>  kmod-i2c-algo-bit

    <*>kmod-i2c-ralink

    保存退出

     

    #make  kernel_menuconfig

    DeviceDrivers --->

    <*>I2C support --->

    <*>I2C device interface

    I2CHardware Bus support --->

    <*>Ralink I2C Controller

    保存退出

    三、          修改dts内核树

    #cdbarrier_breaker

    #cdtarget/linux/ramips/dts/

    #vim  xxx.dts             #编辑对应的dts文件

     

    在palmbus下加入i2c总线加入:

    palmbus@10000000{

    i2c@900 {

    compatible ="ralink,mt7620n-i2c", "ralink,rt2880-i2c";

          reg= <0x900 0x100>;

     

    resets = <&rstctrl 16>;

          reset-names= "i2c";

                        

    #address-cells = <1>;

          #size-cells= <0>;

     

          status= "okay";

           };

    }

     

    在pinctrl中将i2c引脚转换为i2c模式:

           pinctrl {

                  state_default: pinctrl0 {

                         default {

                                ralink,group = "ephy","wled", "pa", "wdt", "uartf";

                                ralink,function = "gpio";

                         };

                         i2c_pins:i2c {

                                i2c{

                                       lantiq,group= "i2c";

                                       lantiq,function= "i2c";

                                };

                         };

                  }

           保存退出

           重新编译固件,烧写成功后发现/dev/下面多了一个设备文件/dev/i2c-0,这就说明i2c驱动加载成功了,下面将说明如何在应用层中使用i2c驱动。

     

    四、          应用层中使用i2c驱动

    1、打开文件

    fd= open(“/dev/i2c-0”, O_RDWR);

    if(fd< 0)

    {

            perror(“open”);

    }

    2、设置设备地址

    这里假设设备地址为0xA0

    ioctl(fd,IIC_SLAVE, (0xA0 >> 1));

    IIC_SLAVE为设置设备地址命令,在本驱动中其值为0x0703(可在源码中求证),在实际程序中不知道IIC_SLAVE定义在那个头文件中所以以0x0703代替,这里如有哪位大神了解还望指教。

    3、写数据

    向24c02的0x14和0x15中写入两个数据0x55,0x17

    Unsignedchar buf[3] = {0x14, 0x55,0x17};

    Write(fd,buf, 3);

                  这个函数实际操作流程如下:

    1)发送起始信号;

    2)发送设备地址(0xA0)加写标志位;

    3)发送操作地址0x14;

    4)发送数据0x55、0x17;

    5)发送停止信号。

    (注意:每次操作read()或wirte()都会发送设备地址,上述程序中虽然参数上数据长度为3,但实际会发送4个数据,这点很关键。)

    4、读取数据

    从24c02的0x14和0x15中读出数据

    unsignedchar buf[2];

    unsignedchar addr = 0x14;

    write(fd,&addr, 1);

    read(fd,buf, 2);

    这个函数实际操作流程如下:

    Write部分:

    1)发送起始信号;

    2)发送设备地址(0xA0)加写标志位;

    3)发送操作地址0x14;

    4)发送停止信号。

    Read部分:

    5)发送起始信号;

    6)发送设备地址(0xA0)加读标志位;

    7)读出两个字节数据;

    8)发送停止信号

     

     

    展开全文
  • ​ 为了实现在路由器上运行我们的demo 模块代码,使用路由器对应的固件openwrt SDK,在linux环境上进行demo环境搭建测试,生成ipk文件,在路由器上安装运行。 准备动作 1:纯净的ubuntu环境,这里我用ubuntu 20进行...

    概要描述

    ​ 为了实现在路由器上运行我们的demo 模块代码,使用路由器对应的固件openwrt SDK,在linux环境上进行demo环境搭建测试,生成ipk文件,在路由器上安装运行。

    准备动作

    1:纯净的ubuntu环境,这里我用ubuntu 20进行测试。

    2:固件openwrt 对应的SDK包(这里我们使用SDK进行编译,SDK有编译需要用的工具和平台相关的代码等)

    开始进行编译:

    1:纯净的ubuntu环境,进行更新及必要软件的安装

    执行下面相关的命令:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt install make
    sudo apt-get install build-essential
    

    2:安装路由器固件openwrt SDK编译需要的一些依赖包

    执行下面相关命令:

    sudo apt install build-essential ccache ecj fastjar file g++ gawk gettext git java-propose-classpath libelf-dev libncurses5-dev libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget python3-distutils python3-setuptools rsync subversion swig time xsltproc zlib1g-dev
    

    3:配置样例代码,开始进行编译

    1: 上传SDK包,解压后,查看样例代码结构

    注意:这里使用固件 openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64.tar.xz

    ​ 这里样例代码helloword直接上传到SDK包package目录中

    hlp@ubuntu:~/openwrt$ tar -xf openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64.tar.xz
    hlp@ubuntu:~/openwrt$ tar -xf helloworld.tar.xz 
    hlp@ubuntu:~/openwrt$ ll
    drwxr-xr-x 3 hlp hlp     4096 Apr 15 04:46 helloworld/
    -rw-rw-r-- 1 hlp hlp     1764 Apr 22 02:35 helloworld.tar.xz
    drwxr-xr-x 9 hlp hlp     4096 Dec  8 05:09 openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64/
    -rw-rw-r-- 1 hlp hlp 57034908 Apr 22 02:35 openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64.tar.xz
    hlp@ubuntu:~/openwrt$ cp -r helloworld /home/hlp/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64/package
    hlp@ubuntu:~/openwrt$ cd /home/hlp/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64/package
    hlp@ubuntu:~/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64/package$ ls
    helloworld  linux  Makefile  toolchain
    hlp@ubuntu:~/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64/package$ tree helloworld/
    helloworld/
    ├── Makefile
    └── src
        ├── helloworld.c
        └── Makefile
    
    1 directory, 3 files
    
    2: 开始构建编译

    执行“make -j V=s package/helloworld/compile” 开始编译

    make -j V=s package/helloworld/compile
    

    第一次执行make时,或者执行“make menuconfig”时,会打开SDK菜单,可以禁用一些“默认配置”(会构建每个软件包)。

    选择 : Global Build Settings
    注意: 我在重新测试的时候发现,有时候编译的时候,这里的选项必须选择上才能成功,具体原理没清楚。

    在子菜单中取消下列相关选项:

    Select all target specific packages by default = OFF
    Select all kernel module packages by default = OFF
    Select all userspace packages by default = OFF
    Also deselect the Crypto package = OFF
    

    在这里插入图片描述

    开始编译以及查看编译结果:

    hlp@ubuntu:~/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64$ make -j V=s package/helloworld/compile
    ...
    #这里如果编译没有报错,查找对应的ipk文件:
    hlp@ubuntu:~/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64$ find -name *.ipk|grep helloworld
    ./bin/packages/mipsel_24kc/base/helloworld_2.0-2_mipsel_24kc.ipk
    

    可以看到,我们已经生成需要的ipk文件:

    helloworld_2.0-2_mipsel_24kc.ipk

    3:样例代码以及Makefile相关文件:

    1:helloworld/src/helloworld.c

    #include <stdio.h>
    
    int main(void)
    {
        printf("\nHello, world!\n\n");
        return 0;
    }
    

    2:helloworld/src/Makefile

    # build helloworld executable when user executes "make"
    helloworld: helloworld.o
    	$(CC) $(LDFLAGS) helloworld.o -o helloworld
    helloworld.o: helloworld.c
    	$(CC) $(CFLAGS) -c helloworld.c
    
    # remove object files and executable when user executes "make clean"
    clean:
    	rm *.o helloworld
    

    3:helloworld/Makefile

    ##############################################
    # OpenWrt Makefile for helloworld program
    #
    #
    # Most of the variables used here are defined in
    # the include directives below. We just need to 
    # specify a basic description of the package, 
    # where to build our program, where to find 
    # the source files, and where to install the 
    # compiled program on the router. 
    # 
    # Be very careful of spacing in this file.
    # Indents should be tabs, not spaces, and 
    # there should be no trailing whitespace in
    # lines that are not commented.
    # 
    ##############################################
    
    include $(TOPDIR)/rules.mk
    
    # Name and release number of this package
    PKG_NAME:=helloworld
    PKG_VERSION:=2.0
    PKG_RELEASE:=2
    
    
    # This specifies the directory where we're going to build the program.  
    # The root build directory, $(BUILD_DIR), is by default the build_mipsel 
    # directory in your OpenWrt SDK directory
    PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
    
    
    include $(INCLUDE_DIR)/package.mk
    
    
    
    # Specify package information for this program. 
    # The variables defined here should be self explanatory.
    # If you are running Kamikaze, delete the DESCRIPTION 
    # variable below and uncomment the Kamikaze define
    # directive for the description below
    define Package/helloworld
    	SECTION:=utils
    	CATEGORY:=Utilities
    	TITLE:=Helloworld -- prints a snarky message
    endef
    
    # Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
    define Package/helloworld/description
    	If you can't figure out what this program does, you're probably
    	brain-dead and need immediate medical attention.
    endef
    
    # Specify what needs to be done to prepare for building the package.
    # In our case, we need to copy the source files to the build directory.
    # This is NOT the default.  The default uses the PKG_SOURCE_URL and the
    # PKG_SOURCE which is not defined here to download the source from the web.
    # In order to just build a simple program that we have just written, it is
    # much easier to do it this way.
    define Build/Prepare
    	mkdir -p $(PKG_BUILD_DIR)
    	$(CP) ./src/* $(PKG_BUILD_DIR)/
    endef
    
    # We do not need to define Build/Configure or Build/Compile directives
    # The defaults are appropriate for compiling a simple program such as this one
    
    # Specify where and how to install the program. Since we only have one file, 
    # the helloworld executable, install it by copying it to the /bin directory on
    # the router. The $(1) variable represents the root directory on the router running 
    # OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install 
    # directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the 
    # command to copy the binary file from its current location (in our case the build
    # directory) to the install directory.
    define Package/helloworld/install
    	$(INSTALL_DIR) $(1)/bin
    	$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
    endef
    
    # This line executes the necessary commands to compile our program.
    # The above define directives specify all the information needed, but this
    # line calls BuildPackage which in turn actually uses this information to
    # build a package.
    $(eval $(call BuildPackage,helloworld))
    

    测试demo

    上传到我们的路由器固件环境上,使用opkg 进行安装并执行进行测试。

    使用scp命令进行文件的远程拷贝,拷贝到我们的目标机192.168.50.189的/tmp/目录下:

    hlp@ubuntu:~/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64$ find -name *.ipk|grep helloworld
    ./bin/packages/mipsel_24kc/base/helloworld_2.0-2_mipsel_24kc.ipk
    hlp@ubuntu:~/openwrt/openwrt-sdk-ramips-mt7621_gcc-7.4.0_musl.Linux-x86_64$ scp ./bin/packages/mipsel_24kc/base/helloworld_2.0-2_mipsel_24kc.ipk root@192.168.50.189:/tmp/
    The authenticity of host '192.168.50.189 (192.168.50.189)' can't be established.
    RSA key fingerprint is SHA256:+84ZoCRn+MwGF4lgdT7Kq5WJs9yWrb/KK5qPslu0ZAQ.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '192.168.50.189' (RSA) to the list of known hosts.
    root@192.168.50.189's password: 
    helloworld_2.0-2_mipsel_24kc.ipk 
    

    在目标机192.168.50.189环境上进行查看,安装,以及测试:

    root@transCOMM:/tmp# ls -l hello*
    -rw-r--r--    1 root     root          1862 Apr 11 14:57 helloworld_1.0-1_mipsel_24kc.ipk
    -rw-r--r--    1 root     root          1895 Apr 17 17:40 helloworld_2.0-2_mipsel_24kc.ipk
    root@transCOMM:/tmp# opkg install helloworld_2.0-2_mipsel_24kc.ipk 
    Installing helloworld (2.0-2) to root...
    Configuring helloworld.
    Collected errors:
     * opkg_conf_parse_file: Duplicate src declaration (openwrt_base http://downloads.openwrt.org/snapshots/packages/mipsel_24kc/base). Skipping.
     * opkg_conf_parse_file: Duplicate src declaration (openwrt_luci http://downloads.openwrt.org/snapshots/packages/mipsel_24kc/luci). Skipping.
     * opkg_conf_parse_file: Duplicate src declaration (openwrt_packages http://downloads.openwrt.org/snapshots/packages/mipsel_24kc/packages). Skipping.
    root@transCOMM:/tmp# helloworld
    
    Hello, world!
    
    root@transCOMM:/tmp# 
    
    

    其他:opkg update/opkg remove helloworld

    注意:如果编译有问题,可能是makefile有问题,但也可能是其他问题(有不知所以的问题)

    同时,登录路由器ip,查看:

    在这里插入图片描述
    如果编译有报错解决不了,请分析Makefile的空格以及设置问题,
    或者找我要其他的样例代码进行测试。

    展开全文
  • openwrt 环境安装LNSP

    2020-03-19 16:54:02
    本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正;...cd openwrt make menuconfig Languages -> PHP 安装PHP-1​ ...
  • [OpenWrt] 如何在OpenWRT环境下做开发

    千次阅读 2012-11-27 15:04:12
    经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解。在这里将我的开发心得做个整理。 1、搭建开发环境 首先,我们需要一个为路由器定制的开发环境,具体可以参考我的另一篇日志:
  • openwrt环境搭建

    2019-01-04 09:18:19
    参考了网上很多文章,谢谢各位大牛 1)使用ubuntu系统,不建议使用redhat,个人认为ubuntu在操作上比redhat简单,尤其是我在redhat上...3)安装各种openwrt编译需要的组件 sudo apt-get install g++  sudo apt-...
  • 经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解。在这里将我的开发心得做个整理。 1、搭建开发环境 首先,我们需要一个为路由器定制的开发环境,具体可以参考我的另一篇日
  • 《在(虚拟机)ubuntu16.04上进行openwrt环境搭建及源码下载》 分三步走: 1、openwrt编译环境搭建 2、openwrt源码下载 3、feeds更新 1、openwrt编译环境搭建 (1)ubuntu 16.04版本的 执行 sudo apt-get install ...
  • openwrt 环境下通过3G/4G dongle发送短信

    千次阅读 2019-01-15 10:09:48
    1、首先openwrt环境中编译gcom工具   2、参考网站  https://www.xuebuyuan.com/1046229.html  http://dev.archive.openwrt.org/ticket/18424  学习到如何通过gcom调用dongle /dev/ttyUSB1  方法如下: ...
  • OpenWrt环境搭建和编译过程

    万次阅读 2019-05-29 14:13:36
    1、环境要求 编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要: 一个纯净的OpenWrt编译系统大约需要200MB的空间。 一个包含feeds的OpenWrt编译系统大约需要300MB的空间。 编译feeds中的软件包大约...
  • OpenWrt环境搭建——Uboot编译-SDK编译(元电荷) 安装Ubuntu16.04 虚拟机基本配置-ssh-samba-等等 克隆代码仓库(拉取代码带本地) 搭建环境安装依赖 编译代码 前两个步骤省略(详情见Ubuntu专栏) 注意:由于...
  • 本次搭载编译所需要的环境 -->本机使用的ContOS6.2 1.在linux用户下下载安装git yum install git *必须使用非root用户进行操作 2.添加一个普通用户 addueser openwrt passwd openwrt ****** ...
  • openWRT环境搭建详解

    2014-07-12 09:47:57
    2.1 openWRT初体验 (1)openWRT系统的定义和特点  OpenWrt是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件,常常被 用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。  ...
  • 在编译之前我们先要搭建环境,ubuntu下OpenWrt编译环境需要安装很多组件: sudoapt-getinstallgccg++binutilspatchbzip2flexbisonmakeautocnfgettexttexinfounzipshar...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,631
精华内容 2,252
关键字:

openwrt环境