hi3516 rcS


原文链接: hi3516 rcS

设置网络

ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx;
ifconfig eth0 xx.xx.xx.xx netmask xx.xx.xx.xx;
route add default gw xx.xx.xx.xx

ifconfig eth0 192.168.1.11
route add default gw 192.168.1.1
mount tmpfs /tmp -t tmpfs
cd /ko
./load3516dv300 -i -sensor0 imx327

#telnetd #
#udhcpd wlan0
#ifconfig wlan0 192.168.2.1

#hostapd -B /etc/hostapd.conf
/bin/ircut1 &
#cd /root
#/root/sample_snap&

前言

hi3516a内核启动后的rcS所在的文件夹里共有5个文件,如下。本文将对文件夹中的内容进行解析和记录。
在这里插入图片描述
无私分享,从我做起!如有错误,还请指出!

rcS

rcS文件内容如下:

#! /bin/sh

/bin/mount -a

echo "       
            _ _ _ _ _ _ _ _ _ _ _ _
            \  _  _   _  _ _ ___
            / /__/ \ |_/
           / __   /  -  _ ___
          / /  / /  / /
  _ _ _ _/ /  /  \_/  \_ ______
___________\___\__________________
"                                 
for initscript in /etc/init.d/S[0-9][0-9]*
do                                        
        if [ -x $initscript ] ;
        then
                echo "[RCS]: $initscript"
                $initscript
        fi
done      

########################################
#set ip                                 
ifconfig eth0 192.168.1.22 netmask 255.255.255.0 up
route add default gw 192.168.1.1    

ifconfig lo 127.0.0.1                              
telnetd &                                          

# uart1 mux                                        
himm 0x200f007c 0x01                               
himm 0x200f0084 0x01                      

mount -t ramfs none /tmp                  

# insmod                                  
cd /ko                                             
./load3516a -i -sensor bt1120 -osmem 128 -offline  
insmod /ko/extdrv/gpioi2c.ko                       
insmod /ko/extdrv/sil9135.ko                       
##########################################         
source /etc/profile                                
#audio mux                                         
himm 0x20120004 0x00400000                         
himm 0x201200e0 0x0d                               
himm 0x200f01c4 0x02                               

cd /mnt/app                                        
./Hi3516a_hdmi_rtsp  &

第一步:/bin/mount -a
mount -a 是在系统启动后去执行fstab中mount;
-a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)
如果想实现开机自动挂载某设备,只要修改/etc/fstab文件即可。
查看fstab文件,vi /etc/fstab,如下图:
在这里插入图片描述

第二步:执行脚本文件
文件表达式
if [ -f file ] 如果文件存在
if [ -d … ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行
第三步:set ip
第四步:设置串口复用,uart1 mux
himm 0x200f007c 0x01
himm 0x200f0084 0x01

在这里插入图片描述
在这里插入图片描述
mount -t ramfs none /tmp
至于为什么要用none,目前还没查到合理的解释,知道的朋友留言告知一下。
tmpfs,临时文件系统,是一种基于内存的文件系统,tmpfs可以使用RAM,但它也可以使用swap分区来存储。
另外,还有一个ramfs文件系统。
ramfs和tmpfs都是在内存上建立的文件系统(Filesystem)。其优点是读写速度很快,但存在掉电丢失的风险。如果一个进程的性能瓶颈是硬盘的读写,那么可以考虑在ramfs或tmpfs上进行大文件的读写操作。
在这里插入图片描述
从表格可知,ramfs会因为数据的写入自动增长空间,所以可能导致最后系统所有的内存耗完。
tmpfs可以在mount时限定大小,不会自动增长。
ramfs不会用swap。
tmpfs会使用swap。
两者都是用来提升效率,但是tmpfs比ramfs的性能更好。
第五步:insmod加载 ko文件
./load3516a -i -sensor bt1120 -osmem 128 -offline
-i ,加载所有模块, insmod all modules
-sensor bt1120,指定sensor类型是bt1120;
-osmem 128,指定os内核的内存大小是128M;
-offline,离线模式。
load3516a文件详解见传送门
加载外部模块:gpioi2c.ko和/sil9135.ko 。
insmod /ko/extdrv/gpioi2c.ko
insmod /ko/extdrv/sil9135.ko

第六步:audio mux ,设置音频管脚的复用
himm 0x20120004 0x00400000
具体还是配置寄存器的工具himm使用方法见: 传送门
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
himm 0x201200e0 0x0d
在这里插入图片描述在这里插入图片描述
himm 0x200f01c4 0x02
在这里插入图片描述
第七步:后台执行应用程序 ,&是后台执行。
./Hi3516a_hdmi_rtsp &

S00devs

S00devs文件的内容如下所示:

#!/bin/sh

mknod /dev/console c 5 1
mknod /dev/ttyAMA0 c 204 64
mknod /dev/ttyAMA1 c 204 65
mknod /dev/ttyS000 c 204 64
mknod /dev/null    c 1 3

mknod -m 600 console c 5 1
mknod -m 666 null c  1 3
mknod ttyAMA0              c 204 64
mknod -m 600 tty0          c 4   0
mknod -m 600 tty1          c 4   1
mknod -m 666 zero          c 1   5
mknod -m 644 random        c 1   8


主要是利用mknod命令创建一些设备文件,后面的数字是主设备号和次设备号。
mknod命令的使用:
mknod [options] name {bc} major minor
mknod [options] name p

mknod 命令建立一个目录项和一个特殊文件的对应索引节点。第一个参数是 Name 项设备的名称。选择一个描述性的设备名称。mknod 命令有两种形式,它们有不同的标志。

第一种形式中,使用了b 或 c 标志。b 标志表示这个特殊文件是面向块的设备(磁盘、软盘或磁带)。c 标志表示这个特殊文件是面向字符的设备(其他设备)。

第一种形式的最后两个参数是指定主设备的数目,它帮助操作系统查找设备驱动程序代码,和指定次设备的数目,也就是单元驱动器或行号,它们是十进制或八进制的。一个设备的主要和次要编号由该设备的配置方法分配,它们保存在 ODM 中的 CuDvDr 类里。在这个对象类中定义了主要和次要编号以确保整个系统设备定义的一致性,这是很重要的。

在 mknod 命令的第二种形式中,使用了 p 标志来创建 FIFO(已命名的管道)。

标志

vi S01udev

S01udev的文件内容如下:

#!/bin/sh

mkdir /dev/pts
mount -t devpts devpts /dev/pts

mkdir -p /dev/.udev            
udevd --daemon     
udevadm trigger

mount -t devpts devpts /dev/pts
内核虚拟文件。
和proc一样。
Linux提供给管理员通过文件系统和内核进行沟通(读\写)的一种渠道。

pts是远程虚拟终端。devpts即远程虚拟终端文件设备。通过/dev/pts可以了解目前远程虚拟终端的基本情况。

通过对相应的设备文件进行操作,就可以达到操作硬件的目的。
而所谓的虚拟内核文件设备,是直接和内核打交道的。内核是在内存中的,所以说才叫虚拟,因为这个设备文件并不代表真正的硬件,只是存在于内存中的虚拟设备。通过访问这样的文件,可以达到和内核即使通信的目的(读/写)。

mkdir -p /dev/.udev
udevd --daemon
udevadm trigger
描述:systemd-udevd是监听内核发出的设备事件,并根据udev规则处理每个事件。

选项: --daemon 脱离控制台,并作为后台守程运行。

主要功能是创建Udevd守护进程,插入即插即拔的时候udevd会传消息给内核。

S80network

S80network文件是网络相关的,查找cmdline中的和ip相关的信息,然后读出ip信息并打印。如果ip信息不存在,就直接退出。

#!/bin/sh                                                                        

ipaddr=                                                                          
bootp=                                                                           
gateway=                                                                         
netmask=                                                                         
hostname=                                                                        
netdev=                                                                          
autoconf=                                                                        

for ipinfo in `cat /proc/cmdline`                                                
do                                                                               
        case "$ipinfo" in                                                        
        ip=*)                                                                    
                for var in  ipaddr bootp gateway netmask hostname netdev autoconf
                do                                                       
                        eval read $var                                   
                done << EOF                                              
                `echo "$ipinfo" | sed "s/:/\n/g" | sed "s/^[    ]*$/-/g"`
EOF                                                                      
                ipaddr=`echo "$ipaddr" | cut -d = -f 2`
                [ x$ipaddr == x ] && ipaddr=x
                ;;                                        
        esac                                              
done                                                        

[ -z "$ipaddr" ] && exit 0   

echo "      IP: $ipaddr"                                                         
echo "   BOOTP: $bootp"                                                          
echo " GATEWAY: $gateway"                                                        
echo " NETMASK: $netmask"                                                        
echo "HOSTNAME: $hostname"                                                       
echo "  NETDEV: $netdev"                                                         
echo "AUTOCONF: $autoconf"                                               

if [ x$ipaddr == x- ] ; then                                             
        # use DHCP                                                       
        :                                                                
else                                                   
        cmd="ifconfig $netdev $ipaddr"       
        [ x$netmask != x- ] && cmd="$cmd netmask $netmask"
        eval $cmd                                         
        [ x$gateway != x- ] && route add default gw $gateway
fi                                                          

ifconfig lo 127.0.0.1

S90hibernate

S90hibernate文件与电源管理相关的

#!/bin/sh

echo "/root/pm_callback" > /proc/sys/kernel/pm_notifier

cmdline=`cat /proc/cmdline`                            
hbtype=resume              

for str in $cmdline
do                 
        case $str in
             hbtype=*)
             hbtype=`echo "$str" | awk -F"=" '{print $2}'`
        esac
done        

if [ "$hbtype"x = "snap"x ]; then
        echo "hibernate start"
        echo disk > /sys/power/state
fi

附件

hi3516a启动后打印log:

`