一、OpenWrt启动流程
大概流程:
1.CFE
2.linux
3./etc/preinit
4./sbin/init
5./etc/inittab
6./etc/init.d/rcS
7./etc/rc.d/S*
OpenWrt的启动脚本放在/etc/init.d目录下,所以应用程序需要在boot时自动运行,则需要在/etc/init.d中增加相应的脚本文件。而系统开机时自动运行/etc/rc.d目录下的脚本。所以在rc.d目录下、有init.d下脚本的链接文件。
二、创建文件
2.1 创建files目录
按OpenWrt的习惯,一般在package下创建一个自己程序的工程目录,里面分为src和files子目录和Makefile。src目录下一般放自己设计的全部源代码文件。Makefile见MT7688学习笔记(3)——定制OpenWrt系统及添加自开发软件。files目录下放安装文件。
2.2 创建init脚本
在files目录下创建自己程序的init脚本,如(cpp.init)。
三、编写Makefile脚本
见MT7688学习笔记(3)——定制OpenWrt系统及添加自开发软件
如果用户空间的应用程序在boot时要自动运行,则需要在安装方法说明中增加自动运行的脚本文件安装和配置文件安装方法。
define Package/cpp/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/cpp $(1)/bin/
$(INSTALL_DATA) ./files/cpp.config $(1)/etc/config/cpp
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/cpp.init $(1)/etc/init.d/cpp
endef
INSTALL_DIR: =install -d -m0755 意思是创建所属用户可读写和执行,其他用户可读可执行的目录。
INSTALL_BIN: =install -m0755 意思编译好的文件存放到镜像文件目录。
$(1)表示嵌入式系统的镜像目录。
四、编写init脚本
#!/bin/sh /etc/rc.common
# Copyright (C) 2010-2011 OpenWrt.org
START=99
STOP=10
第一行称为shebang line,它使用/etc/rc.common脚本作为包装器。
脚本文件需要START参数,说明在boot时的优先级,如果在boot过程启动后再关闭,则需要进一步设置STOP参数。如果STOP参数存在,其值必须大于START。
由/etc/rc.d/S10boot知道,装载内核驱动模块的优先级为10,需要使用自己设计的内核驱动模块的程序其START的值必须大于10。同样由/etc/rc.d/S40network知道,使用网络通信的程序其START的值必须大于40。
start() {
echo 'JWR1 start.' >/tmp/cpp.log
if [ -b /dev/mmcblk0p1 ];then
if mountpoint -q /mnt
then
echo 'mount is mount' >>/tmp/cpp.log
sd_state=1;
else
echo 'mount /dev/mmcblk0p1 /mnt/' >>/tmp/cpp.log
mount /dev/mmcblk0p1 /mnt/ #......SD...
if [ $? -eq 0 ];then
echo 'mount /dev/mmcblk0p1 /mnt/ ok' >>/tmp/cpp.log
sd_state=1;
else
echo 'mount /dev/mmcblk0p1 /mnt/ fail' >>/tmp/cpp.log
sd_s