openwrt学习总结.docx_第1页
openwrt学习总结.docx_第2页
openwrt学习总结.docx_第3页
openwrt学习总结.docx_第4页
openwrt学习总结.docx_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

openwrt学习总结目录 1:ath9k中的EEPROM中的数据22:Atheros原厂中的EEPROM的中的数据33:如何在openwrt添加自定义模块接口43.1 make menuconfig中的kernel modules43.2:添加自己的模块到文件netdevices.mk64:openwrt内核编译及文件系统的生成74.1 主.config和内核.config的关系84.2 Linux内核uimage生成114.3 Linux根文件系统生成125:openwrt中的进程启动方式126:网络配置156.1:有线网络配置156.2:无线网络配置167:LUCI命令使用入门168:openwrt web页面代码分析191:ath9k中的EEPROM中的数据在文件compat-wireless-2014-03-31driversnetwirelessathath9k Ar9003_eeprom.h中定义了struct ar9300_eeprom 其中保存了校准相关的数据变量, 如MAC地址,eepromVersion;此数据结构值得研究,同时在sys文件系统了定义了查看这些变量值的接口,其交互的接口如下:rootOpenWrt:/sys/kernel/debug/ieee80211# lsphy0 phy1 此处说明系统有俩个wifi网卡,每一张都有自己的状态信息。主要的文件有:modal_eeprom,rx_chainmask,tx_chainmask。2:Atheros原厂中的EEPROM的中的数据经过ath9k和Atheros SDK中的代码对比之后,发现, EEPROM中的存放的数据结构完全一致。故可以知道,我们可以通过Atheros原厂提供的art.ko及校准文件对openwrt系统进行校准来提供wifi性能的稳定。可能涉及到的问题如下:1:需要对ark.ko。即需要对内核相关的代码进行移植。2:需要进一步确定上面定义的ar9300_eeprom 数据存放在什么地方,从什么地方读取。3:需要跟Atheros原厂的进行对比,确保准确无误。代码当然入口点如下: 16.300000 ath_ahb_eeprom_read 16.300000 ath9k_hw_use_flash3:如何在openwrt添加自定义模块接口3.1 make menuconfig中的kernel modules其中的各个配置选项来自于下面目录中的.mk文件rootlocalhost /openwrt/openwrt/trunk/package/kernel/linux/modules$ls001-depends.mk crypto.mk hwmon.mk leds.mk netdevices.mk.bak nls.mk sound.mk video.mk wireless11221.mkblock.mk firewire.mk i2c.mk lib.mk netfilter.mk other.mk spi.mk virtual.mk wireless.mkcan.mk fs.mk input.mk netdevices.mk netsupport.mk pcmcia.mk usb.mk w1.mkrootlocalhost /openwrt/openwrt/trunk/package/kernel/linux/modules$兄弟们可以打开就知道,其中我们将自己将要添加的内核模块添加到Network Devices中。添加之后的效果为:3.2:添加自己的模块到文件netdevices.mk其中自己的模块代码在FILES:=$(LINUX_DIR)/drivers/net/ethernet/ethernet中内核控制选项为:CONFIG_AR9344_PHY8035 其中这个很重要需要在多个文件中进行定义AR9344_PHY8035。在下面的目录中的Makefile添加obj-y += ethernet/rootlocalhost /openwrt/openwrt/trunk/build_dir/target-mips_34kc_uClibc-/linux-ar71xx_generic/linux-3.10.36/drivers/net/ethernet$more Makefile# Makefile for the Linux network Ethernet device drivers.#obj-y += ethernet/同时还需要在Kconfig中添加source drivers/net/ethernet/ethernet/Kconfig其中内容如下:rootlocalhost /openwrt/openwrt/trunk/build_dir/target-mips_34kc_uClibc-/linux-ar71xx_generic/linux-3.10.36/drivers/net/ethernet/ethernet$cat Kconfigconfig AR9344_PHY8035 /很重要的东西 tristate db12x borad for 9344chip depends on PCI -help- This driver supports for ar9035 phy id其中看看自己模块中的makefile的内容如下:主要上面makefile中的CONFIG_AR9344_PHY8035的变量,关于此值相关的配置值如下:rootlocalhost /openwrt/openwrt/trunk$cat .config |grep 9344CONFIG_PACKAGE_kmod-ar9344_ethernet=y其中不管CONFIG_PACKAGE_kmod-ar9344_ethernet=y的值是Y还是M,Linux内核目录中的CONFIG_AR9344_PHY8035的值都是M,古可以知道在根目录(/openwrt/openwrt/trunk)中的make menuconfig的时候是会与Linux内核中的config文件建立起联系的,之间是怎么的联系,现在还不是很清楚。当在在总的menuconfig中选中自定义的模块之后,系统会自动将此模块加载到内核所在文件系统中同事也会成ipk格式的文件。Generating index for package./kmod-ar9344_ethernet_3.10.36-1_ar71xx.ipk4:openwrt内核编译及文件系统的生成在此节中主要关注是make menuconfig生成的.config文件和内核生成的.config文件的关系,openwrt中如何生成内核及文件系统。在分析过程中主要查阅的是编译过程生成的log。其中涉及到的主要的makefile如下:rootlocalhost /openwrt/openwrt/trunk/include$ll kernel*-rwxr-r-. 1 nobody nobody 4136 2014-05-15 01:26 kernel-build.mk-rwxrwxrwx. 1 suiyuan suiyuan 4135 2014-05-09 12:07 kernel-build.mk.bak-rwxr-r-. 1 nobody nobody 7101 2014-05-15 01:27 kernel-defaults.mk-rwxrwxrwx. 1 suiyuan suiyuan 7100 2014-05-09 12:07 kernel-defaults.mk.bak-rwxrwxrwx. 1 suiyuan suiyuan 7341 2014-05-09 12:07 kernel.mk-rwxrwxrwx. 1 suiyuan suiyuan 1406 2014-05-09 12:07 kernel-version.mk及/openwrt/openwrt/trunk/target/linux/ar71xx中的涉及到的makefile4.1 主.config和内核.config的关系Linux系统中根据make menuconfig配置阶段来生成的.config文件来决定哪些文件是否编译到系统中。故首先需要搞清楚这俩个.config文件之间的关系。其实这个问题已经在第三节中涉及到了。在openwrt的内核之中,除了必要的需要直接编译进内核之中的,其他驱动都是以模块的形式存在的。Linux内核中主要就是系统必须的驱动程序,而openwrt中除了Linux内核中包含的驱动程序之外还包含了上层应用程序,其这些应用程序占用了munuconfig中的绝大多数配置选项,而与Linux内核相关的配置被包含在了中,在此内部中的配置都是以模块的形式,在编译完之后存在于根文件系统之中。其中的菜单选项定义在如下目录中:现在以LED模块为例来说明这俩个.config文件的关系。下面是openwrt的make menuconfig 所配置的选项其中.config文件中led相关的信息如下:其中M/Y的意思在于是否将此模块添加到生成的根文件系统root-ar71xx中去,与Linux kernel中的M/Y的意思不同。同时在编译之后会将上面的模块制作成ipk格式的文件:现在看看Linux内核中与上面相关的模块的配置信息:在看之前需要查看文件:leds.mk中的内容。openwrt中对Linux内核中的代码的配置选项重新写了自己的配置规则。/openwrt/openwrt/trunk/package/kernel/linux/modules$cat leds.mk现在已leds.mk中具体的代码内容为例来说明:define KernelPackage/ ledtrig-timer 此处的ledtrig-timer就是上面看到的 SUBMENU:=$(LEDS_MENU) TITLE:=LED Timer Trigger KCONFIG:=CONFIG_LEDS_TRIGGER_TIMER 会出现在Linux kernel的.config中。 FILES:=$(LINUX_DIR)/drivers/leds/$(if $(call kernel_patchver_ge,3.10),trigger/)ledtrig-timer.ko AUTOLOAD:=$(call AutoLoad,50,ledtrig-timer,1)endefdefine KernelPackage/ledtrig-timer/description Kernel module that allows LEDs to be controlled by a programmable timer via sysfsendef$(eval $(call KernelPackage,ledtrig-timer)=目前内核编译时执行的makefile中定义的宏顺序为:BuildImage -中的如下宏定义; install: compile install-targets$(call Image/BuildKernel)$(call Image/BuildKernel/Initramfs)$(call Image/InstallKernel)$(call Image/mkfs/cpiogz)$(call Image/mkfs/targz)$(call Image/mkfs/ext4)$(call Image/mkfs/iso)$(call Image/mkfs/jffs2)$(call Image/mkfs/jffs2_nand)$(call Image/mkfs/squashfs)$(call Image/mkfs/ubifs)$(call Image/Checksum)目前之研究:$(call Image/BuildKernel) 的定义:首先看看/openwrt/openwrt/trunk/target/linux/ar71xx中的makefile文件,其中调用了$(eval $(call BuildTarget) 其中此处的的BuildTarget在/openwrt/trunkopenwrt/trunk/include中的target.mk中定义的。其中有俩个地方进行了定义。如下: BuildTarget=$(BuildTargets/DumpCurrent) BuildTarget?=$( BuildKernel)其中BuildKernel 定义在/openwrt/openwrt/trunk/include/kernel-build.mk中,其中有如下一行:$(Kernel/Prepare) 的定义如下:define Kernel/Prepare$(call Kernel/Prepare/Default)endef在此定义中有:#xzcat $(DL_DIR)/$(LINUX_SOURCE) | $(TAR) -C $(KERNEL_BUILD_DIR) $(TAR_OPTIONS)$(Kernel/Patch)上面俩行分别为对当前的内核进行解压及patch如果需要查看Linux内核.config文件是如何生成的可以查看如下宏定义:define Kernel/Configure/Default4.2 Linux内核uimage生成目前使用的内核加载系统为uboot,如果要使uboot能正确的加载Linux内核,需要将编译成zImage格式的内核添加64个字节uboot头信息转化为uImage格式。同时如果考虑内核压缩需要对uImage进行一定格式的压缩。目前Atheros平台中使用的压缩格式为:lzmaopenwrt-ar71xx-generic-uImage-lzma.bin知道如何生成Linux 内核,有助于自己手动生成内核镜像。之前在移植Linux 2.6.31的内核到openwrt中,系统自动生成的镜像不能启动,故之后是根据vmlinux手动创建image。上面的patch-cmdline对Linux内核patch上系统启动时需要知道的 CMD_LINE的值。此处可以知道Kernel command line的值为:board=DB120 console=ttyS0,115200 mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6336k(rootfs),1408k(kernel),64k(nvram),64k(art)ro,7744k0x50000(firmware)之后接着对vmlinux进行压缩,压缩格式为:lzma,压缩之后生成的文件为:vmlinux-db120.bin.lzma,接着将生成的文件转化为:uimage格式。最终生成的文件为:vmlinux-db120.bin.lzma4.3 Linux根文件系统生成目前Atheros中使用的文件系统文件为:openwrt-ar71xx-generic-db120-rootfs-jffs2.bin在生成文件系统之前,需要将使用的lib,及系统需要的应用程序copy到一个特定的目录,之后使用命令mkfs.jffs2生成压缩格式的一个bin文件。在openwrt中压缩的总的文件在root-ar71xx目录中。/openwrt/openwrt/trunk/build_dir/target-mips_34kc_uClibc-/ root-ar71xx用户可以直接将需要执行的程序copy到root-ar71xx中的相应目录,完成文件的打包处理。mtd -r write xxx.bin firmware5:openwrt中的进程启动方式openwrt中start,stop,enable,disable一个服务。系统中的服务程序的脚本都在/etc/init.d/的目录中。上面的执行过程可以知道,一个脚本可以有帮助信息及enable,disable功能,其差别会在rc.d中生成和删除以S或者K结束的文件。START=10STOP=98、下面演示如何写自己的应用程序的启动脚本,分别对此脚本进行start,stop,enable,disable操作。6:网络配置此处的网络配置主要关注的是/etc/config中的俩个文件network,wireless,因为当我们通过web配置有线和无线网络的时候,最终对网络的配置都会保存到上面的俩个文件之中。对此部分的配置主要就是使用第三节中UCI命令来实现。6.1:有线网络配置由于目前我的当前的板子有一个WAN+4个LAN口,4个LAN口是内部交换的。古在配置文件中我们可以看到WAN和LAN的配置信息。对于WAN口,当前使用的是static IP,其web上面的配置与network上面的配置一致。同时可以根据UCI来读取或者设置接口的信息。6.2:无线网络配置有上面的信息可以知道,其中type mac80211 类型会在LCUI的脚本中对其类型进行判断。使用的信道是11,WiFi模式为:11g,当前功率,国家码等信息。7:LUCI命令使用入门UCI是(Unified Configuration Interface)集中式配置信息管理接口的缩写,他是OpenWRT引进的一套配置参数管理机制。UCI管理了OpenWRT下最主要的系统配置,并且提供了简单,容易,标准化的人机交互接口。UCI的管理包含了网络配置,无线配置,系统信息配置等作为路由器的系统主要配置参数。UCI可以帮助开发人员快速的开发出基于OpenWRT的智能路由产品的控制界面(诸如浏览器界面,手机界面等)。UCI的使用:UCI文件读写方式UCI文件的读写有两种方式:UCI文件的读写可以通过OpenWRT附带的uci指令来完成,这种读写方式可以用于命令行也可以用于自己开发的WEB程序来操作。 直接使用系统的vi编辑器直接修改UCI文件,所做的修改也可以被系统所识别。 UCI指令读取配置语法格式: uci 查看类语法:uci get . 取得一个键的值 或根据段的名字取得类型uci show . 显示出全部 / 配置文件 / 段 / 键 的完整格式uci changes 显示出全部 / 配置文件 的未保存修改(经过commit语法保存后就不再有记录)变更类语法:uci add 增加一个匿名段配置到配置文件中uci set .= (增加/修改)一个有名字的段 / 增加一个段中的键和值uci add_list .= 增加一个列表集合数据到配置文件中uci del_list .= 删除一个指定值的列表集合数据uci delete .= 删除一个 段 / 键 / 指定值的键uci commit 将变更保存在文件中,或保存全部变更到各自文件OPENWRT使用命令行设置无线和有线网络uci set network.lan.ipaddr=lan ip 使用pppoe设置 uci set to=pppoe /设置wan口类型为pppoe uci set network.wan.username=上网帐户 uci set network.wan.password=上网密码 /这两行设置pppoe用户名和密码 如果要挂在上级路由下面,就需要进行下面的设置 uci set to=none /关掉wan uci set network.lan.gateway=上级路由ip /网关指向上级路由 uci set network.lan.dns=上级路由ip /dns指向上级路由 uci set dhcp.lan.ignore=1 /关掉lan的dhcp 最后对无线网络进行配置 uci set wireless.wifi-device0.disabled=0 /打开无线 uci set wireless.wifi-device0.txpower=17 /设置功率为17dbm 太高会烧无线模块 uci set wireless.wifi-device0.channel=6 /设置无线信道为6 uci set wireless.wifi-iface0.mode=ap /设置无线模式为ap uci set wireless.wifi-iface0.ssid=自己设置SSID /设置无线SSID uci set work=lan /无线链接到lan上 uci set wireless.wifi-iface0.encryption=psk2 /设置加密为WPA2-PSK uci set wireless.wifi-iface0.key=密码 /设置无线密码 提交应用配置 Shell代码 uci commit /应用 /etc/init.d/network restart /重启网络服务 安装luci管理界面 Shell代码 opkg update / 更新软件列表 opkg list-installed / 查看已安装软件 opkg install luci / 安装LUCI opkg install luci-i18n-chinese / 支持中文 即可完成LUCI的安装。 输入以下命令开启支持web服务的uhttpd,并设置其为自启动: /etc/init.d/uhttpd enable # 开机自启动 /etc/init.d/uhttpd start # 启动uhttpd 实例演示rootOpenWrt:/etc/config# 显示network 配置rootOpenWrt:/etc/config# uci show network network.loopback=interfacenetwork.loopback.ifname=to=staticnetwork.loopback.ipaddr=mask=network.globals=globalsnetwork.globals.ula_prefix=fd7a:3d01:37c7:/48network.lan=interfacenetwork.lan.ifname=eth0.1 eth1network.lan.type=to=staticnetwork.lan.ipaddr=mask=network.lan.ip6assign=60network.wan=interfacenetwork.wan.ifname=to=dhcpnetwork.wan6=interfacenetwork.wan6.ifname=to=dhcpv6network.switch0==switch0network.switch0.reset=1network.switch0.enable_vlan=1network.switch_vlan0=switch_vlannetwork.switch_vlan0.device=switch0network.switch_vlan0.vlan=1network.switch_vlan0.ports=0t 2 3 4 5network.switch_vlan1=switch_vlannetwork.switch_vlan1.device=switch0network.switch_vlan1.vlan=2network.switch_vlan1.ports=0t 1network.switch1==switch1network.switch1.reset=1network.switch1.enable_vlan=1network.switch_vlan2=switch_vlannetwork.switch_vlan2.device=switch1network.switch_vlan2.vlan=1network.switch_vlan2.ports=0 1 2 3 4 5rootOpenWrt:/etc/config# =查看系统中安装了那些二进制文件rootOpenWrt:/overlay# opkg listbase-files - 152-r40740wpad-mini - 2014-04-24-18:openwrt web页面代码分析首先看看openwrt中自带的页面代码如下:rootOpenWrt:/usr/lib/lua# lsbit.lua iwinfo.so luci nixio nixio.so ubus.so uci.sorootOpenWrt:/usr/lib/lua# cd luci/rootOpenWrt:/usr/lib/lua/luci# lscacheloader.lua dispatcher.lua ip.lua sys.luacbi fs.lua ltn12.lua templatecbi.lua http model template.luaccache.lua http.lua sauth.lua toolsconfig.lua i18n sgi util.luacontroller i18n.lua store.lua version.luadebug.lua init.lua看看lua目录下面有哪些目录存在:其中需要关注的文件目录如下:usr/lib/lua/luci/controller 其中包括系统默认的一级菜单。在LuCI中Controller的文件定义在固件中的/usr/lib/lua/luci/controller目录中,模版目录在/usr/lib/lua/luci/view目录下,而model则是在/usr/lib/lua/luci/model中。而model中有一个特殊的模块叫做CBI,被称为LuCI中最酷的功能,该模块的功能是方便的对一个配置文件进行修改。在研究其代码的时候会看到:call,template和cbi。在上面的/usr/lib/lua/luci/controller中的代码中,每一个文件的开始都有一个function index()的定义,其中:page = entry(admin, network, wireless_join, call(wifi_join), nil)entry函数的定义说明如下: pathis a table that describes the position in the dispatching tree: For example a path of foo, bar, baz would insert your node in foo.bar.baz. targetdescribes the action that will be taken when a user requests the node. There are several predefined ones of which the 3 most important (call, template, cbi) are described later on on this page titledefines the title that will be visible to the user in the menu (optional) orderis a number with which nodes on the same level will be sorted in the menu (optional)其中target主要分为三类:call,template和cbi。call用来调用函数,template用来调用已有的htm模版,而CBI模块则是使用非常频繁也非常方便的模块,包含的一系列lua文件构成界面元素的组合,所有cbi模块中的控件都需要写在luci.cbi.Map中,在cbi模块中定义各种控件,Luci系统会自动执行大部分处理工作。/usr/lib/lua/luci/下有三个目录model、view、controller,它们对应M、V、C。Call()方法会调用controller里的函数,主要通过openwrt系统的uci、network、inconfig等工具对系统进行设置,如果需要还会生成新界面。动态生成界面的方法有两种,一是通过cbi()/form()方法,它们利用model中定义的模板map,生成html文件;另一种是通过template()方法,利用view中定义的htm(一种类似html的文件),直接生成界面。template用来调用已有的htm模版,模版目录在lualuciview目录下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论