admin 管理员组

文章数量: 887032


USB继电器控制:
	开:a0 01 01 a2
	关:a0 01 00 a1

ethtools 使用方法:
    ethtool -s eth0 speed 1000 duplex full autoneg off        //设置eth0网卡为1000M 全双工 自动协商关闭
    ethtool -s eth0 speed 100 duplex full autoneg off        //设置eth0网卡为1000M 全双工 自动协商关闭
    ethtool -s eth0 speed 10 duplex full autoneg off        //设置eth0网卡为1000M 全双工 自动协商关闭
 
 
iperf使用方法:
    iperf3 -s -p 5001 -i 1 -f MBytes                    //-s 以服务的方式启动  -p指定端口  -i每次报告之间的时间间隔 -f格式化带宽输出:Kbits Mbits KBytes MBytes
    iperf -c 10.4.2.233 -p 5001 -i 1 -f MBytes -R        //-c 以客户端的方式启动 后面跟服务器的IP地址 -R 服务器发送,客户端接收
    iperf -c 172.16.1.101 -p 5001 -i 1 -f MBytes -R
    iperf3 -c 192.168.1.100 -p 5002 -i 1 -f MBytes -R
    iperf3 -c 172.26.10.53 -p 5002 -i 1 -f MBytes -t 200 -R
    iperf3 -c 192.168.1.202 -p 5001 -i 1 -f MBytes -t 200 -R
    iperf3 -c 192.168.1.11 -p 5001 -i 1 -f MBytes -t 200 -R

iperf3 -c 172.16.8.2 -p 13402 -i 1 -f MBytes -t 200 -R
    
ARM上使用tftp命令下载文件:
    time tftp -g -l /zImage -r zImage 200.200.200.100        //从IP地址为200.200.200.254网络上下载zImage,并把zImage保存到根目录下,命名为zImage
    { time tftp -g -l /zImage -r zImage 10.4.2.233;} 2>>    tftp.log    //从IP地址为200.200.200.254网络上下载zImage,并把zImage保存到根目录下,命名为zImage
    
    time tftp -g -l /50M -r 50M 200.200.200.100
tftp参数说明:
基本参数:
-g:   get,获取文件
-p:   put,长传文件
-l FILE:本地的文件,名为FILE
-r FILE:远程的文件,名为FILE

eMMC寿命值获取:
	echo $(cat /sys/kernel/debug/mmc0/mmc0:0001/ext_csd) | cut -c 537-538
	
UFS寿命在获取:
	cat /sys/devices/platform/soc/1d84000.ufshc/health_descriptor/life_time_estimation_a
	cat /sys/devices/platform/soc/1d84000.ufshc/health_descriptor/life_time_estimation_b
 
 
eMMC读写速度测试:
    1、写速度测试:
        dd if=/dev/urandom of=/test_file bs=1M count=100 conv=fsync            //如果不加 conv=fsync,命令结束时,可能没有写到磁盘上去
 
    2、读缓存测试:
        dd if=/test_file of=/dev/null bs=1M count=100                        //没有清除缓存,那么会从缓存里面读取数据
    
    3、读磁盘测试:
        sysctl -w vm.drop_caches=3                                            //先清除缓存
        dd if=/test_file of=/dev/null bs=1M count=100                        //从磁盘里面读取数据
 
出发fsck修复:
	dd if=/dev/zero of=/dev/mmcblk0p50 bs=256 count=100 conv=fsync
 
网络设置:
    1、内核下设置IP
    设置IP地址和子网掩码:
        ifconfig eth0 10.4.5.253 netmask 255.255.255.0
        ifconfig eth0 10.4.5.20 netmask 255.255.255.0
        ifconfig eth1 10.4.5.20 netmask 255.255.255.0
    添加网关:
        route add default gw 10.4.5.1
        route add default gw 192.168.1.100
        
    挂载nfs服务器:
        mount -t nfs -o nolock,rsize=4096,wsize=4096 10.7.0.147:/nfs /nfs
        mount -t nfs -o nolock 10.4.2.233:/nfs /nfs
        mount -t nfs -o nolock 10.4.2.233:/addDisk /nfs
    卸载nfs服务器:
        umount /nfs
    强行卸载nfs服务器:
        umount -fi /nfs
 
判断文件夹是否被挂载:
    grep '/mnt' /proc/mounts        //挂载相关的信息都会记录在/proc/mounts文件里面        
        
    2、uboot下设置IP
    setenv ipaddr   "10.4.5.20"                        //设置本地IP地址
    setenv serverip "10.4.2.214"                        //设置服务器IP地址
    setenv netmask "255.255.255.0"                        //设置子网掩码
    setenv gatewayip "10.4.5.1"                            //设置网关
    setenv ethaddr "AA:BB:CC:DD:EE:FF"                    //本地物理地址(MAC)
 
    修改mac地址:
ifconfig  eth0 down
ifconfig eth0 hw ether 4A:80:26:1E:2C:8D
ifconfig eth0 up
设置MAC地址注意事项:
    P地址分为三类:广播,组播和单播。
    广播就是:FF:FF:FF:FF:FF:FF。
    组播:第一字节最后一位是1,如47:72:65:65:6e:00,47的最后一位是1.
    单播:第一字节最后一位是0,如48:72:65:65:6e:00,48的最后一位是0.
 
Windows清除arp缓存:
	netsh interface ip delete arpcache	//此命令需要在管理员权限下执行 
	
Windows设置网卡的静态arp:
	1、先找到对应网卡的index:
		netsh i i show in				//执行这条命令会显示所有网卡的index
	2、设置静态arp:
		netsh -c i i add neighbors 42 172.16.6.25 ca-ca-ca-23-05-01	//这里的42就是网卡的index。
    
RTC相关操作:
    date -s "2018-05-17 20:10:10"                        //设置时间
    date -s "2019-12-12 08:42:42"
    
    date -s "2019-07-10 09:01:00"                        //设置时间
    date -s "2019-07-16 14:47:50"                        //设置时间
    date -s "2022-10-13 11:08:00"                        //设置时间
    hwclock -w                                            //将时间写入RTC硬件里面
    
    hwclock --show                                        //读取RTC硬件时钟
将date命令的输出进行格式化:
    date -u +%4Y%2m%2d%2H%2M%2S                            //输出年月日时分秒 如:20100102020202 2010年1月2日2时2分2秒
        
        
uboot查看内存内容的命令:
    md addr size                    //示例: md 12c00000 128 查看从12c00000处开始的,大小为128的内存的内容
    mw addr startoffect end offect    //示例: mw 12c00000 0 128 从12c00000开始,将偏移地址0-128之间的内存内容修改为0
        
终端信息重定向:
    1、终端不显示,只保存文件
    ls >> ./test.log    #以追加的方式保存
    ls >  ./test.log    #以覆盖的方式保存
    
    1、终端显示,同时也保存到文件
    ls | tee -a ./test.log    #以追加的方式保存
    ls | tee ./test.log        #以覆盖的方式保存
        
        
svn 下载指定版本的代码:
    样板:svn co addr -r vresion
    示例:svn co https://rden:8443/svn/CM_Software/K_Monitor/SourceCode/trunk -r 123  
        解释:从服务器https://rden:8443/svn/CM_Software/K_Monitor/SourceCode/trunk上面,下载版本号为123的源码
        
        
git 的基本操作:
	git config --global user.name qidong.liu					//git配置用户名
	git config --global user.email qidong.liu@zongmutech	//git配置用户邮箱
	git config user.name 										//git查看用户名
	git config user.email										//git查看用户邮箱
    下载远程代码:git clone addr        //add 是远程仓库的地址
    在本地创建分支,并下载远程分支: git checkout -b dev(本地分支名称) origin/dev(远程分支名称)            //克隆远程分支origin/dev,并且在本地分支将其命名为dev
    查看分支:git branch
    查看远程分支:git branch -r
    查看所有分支:git branch -a
    在本地创建分支dev:git branch dev
    切换到分支dev:git checkout dev
    创建分支dev并切换到该分支:git checkout -b dev
    查看日志信息:git log
    查看分支日志信息:git log branch
    查看当前的状态:git status                            //这条命令会将当前git目录下所有的更改、新建的文件信息列举出来。这里新建的文件会提示没有添加到git版本里面
    查看当前的状态:git status -uno                        //这条命令只会列举已经添加到版本控制器里面的文件作出的对应的改动
	查看合并代码(merge)后,哪些文件有冲突:git status -s   //这条命令,查看合并代码后,哪些文件有冲突需要手动解决
    删除本地分支:git branch -d dev                        //dev是我们要删除的分支    
    删除远程分支:git push origin -delete dev            //dev是我们的远程分支
    撤销git add 的文件:git reset HEAD file                //我们已经使用了add命令,但是没有commit提交
    撤销尚未git add 文件的修改:git check -- file        //这里加上“--”表示是check文件,不加“--”,当文件和分支同名时,check时,默认check的是分支
	git checkout指定commit的指定文件:git checkout 808a932440a34f8a26cff9e1997f70a8eae48bd4 -- prebuilts/root_hijack/etc/init.d/1mkfs.sh
    git搭建服务器:sudo git init --bare issue            //issue是一个目录。我们把这个目录初始化为我们的服务器。
    git下载服务器代码:git clone liuqidong@10.4.2.233:/home/liuqidong/lqd/git/git-server/issue
    git绑定远程服务器:git remote add origin tanglianming@10.4.2.203:/home/tanglianming/lqd/temp/imx6/
    git向远程服务器master推送代码:git push -u origin master    //向远程服务器的master分支推送代码	
																//如: git push origin projects/A_CA_S202/OTA4.0
    更新代码:git pull                       //已经将远程服务器的代码克隆到本地,但是服务器代码更新了。这个时候使用git pull更新最新的服务器代码到本地。
    git恢复到指定版本:git reset --hard vNUM
    查看分支tag1和分支tag2之间哪些文件发生了更改:git diff tag1 tag2 --stat
    查看分支tag1和分支tag2之间哪些文件发生了更改:git diff tag1 tag2 file1        //比较分支tag1和分支tag2 file1文件的区别
    查看git修改的详细信息:git log -p
    查看git最近两次修改的详细信息: git log -p -2
    查看某次提交具体做了哪些更改:git show commit-id
	查看每次提交主要修改了哪些文件:git log --stat		//git log --stat -2 查看最近2次提交,修改了哪些文件
									git log -m --name-only	//查看修改了哪些文件
    创建本地仓库:git init
    删除文件:    git rm --cached file1                //删除控制版本器里面的控制,不删除本地的文件
                git rm --f    file1                    //删除控制版本器里面的控制,同时也删除本地的文件
    将分支A的部分文件合并到分支B上面:
        1、先切换到分支B上面
        2、git check branchA file1 file2        //将分支A的file1和file2合并到分支B上面
	将分支B的某次提交合并到分支A:
		git cherry-pick commit-id				//这里的commit-id就是分支B的某次提交对应的ID
	查看总提交次数 git log --oneline | wc -l
	查看某个用户提交次数  git log --author="用户名" --oneline | wc -l
	查看每个用户提交次数 git shortlog -s -n
	直接通过git生成patch:git format-patch 81d5a2be1411edba164b52dccb8e8a7f74c940f5 -1
	查看文件的提交记录:git log --follow filename
	查看文件的历史修改详细记录:git log --follow -p filename
	根据commit id查找所属分支:git branch --contains 6c13e2a66f90520f47766c43d1536edbd361688b --all	
	查看commit和tag的对应关系:git log --decorate=short 或者 git log --decorate=short --oneline
	
	git打tag:
		给当前分支的最新commit打tag:git tag fdu2.0_8155_v1.1.19/4
		给当前分支的指定commit打tag:git tag fdu2.0_8155_v1.1.19/4 6ffda7e95be871e5f1f7854defbfce5e7ee1b152
		将tag信息推送到远端:git push origin fdu2.0_8155_v1.1.19/4
		一次性推送本地所有tag:git push origin --tags

repo:
	多线程同步:
		repo sync -j 24

tcpdump命令使用说明:
	捕获指定网络设备节点的数据:
		tcpdump -i eth0
	捕获指定网络设备节点指定IP的数据:
		tcpdump -i eth0 host 192.168.1.177
	捕获指定数据长度的包:
		tcpdump -i eth0 -n  'ip[2:2]=68'
		tcpdump -i eth0 -n  'ip[2:2]>67' and 'ip[2:2]<69'
		注:ip[2:2]记录的是网络包里面的数据长度信息。 可以使用>,<,=,>=,<=过滤
	将捕获的数据保存到文件:
		tcpdump -i eth0 -w /data/tcpdumpdata.pcap
		注:后缀是pcap可以使用wireshark解析文件里面的数据
        
开启telnet服务:
    1、将inetd、telnetd文件复制到/usr/sbin目录下面
    2、在/etc/init.d/rc_mxc.S文件里面,在 if grep 前面添加 /usr/sbin/inetd
    3、在/etc目录下创建 inetd.conf 文件,在文件里面添加:telnet stream tcp nowait root /usr/sbin/telnetd telnetd  
    重启,旋转telnet服务就可以连接成功了。
    连接命令:telnet 10.4.5.20
        
        
网络远程连接:
    ssh使用:
        ssh root@200.200.200.200        //连接IP地址为200.200.200.200网络,并使用root用户登录
        
    telnet使用:
        telnet 200.200.200.200            //连接IP地址为200.200.200.200网络
        
gdb不能调试的问题:
    运行gdb程序,提示如下错误信息:
    Could not find platform independent libraries <prefix>
    Could not find platform dependent libraries <exec_prefix>
    Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
    ImportError: No module named site
        
    解决办法:将gdb_lib复制到开发板/usr目录下,同时添加如下环境变量:    
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/gdb_lib
    export PYTHONHOME=/usr/gdb_lib/python2.7
    export PYTHONPATH=/usr/gdb_lib/python2.7
        
    gdb调试程序的过程中,遇到信号导致调试停止,错误信息如下:    
    Program received signal SIGILL, Illegal instruction.
    0x6a8ff2a8 in ?? () from /lib/libcrypto.so.1.0.0
    
    解决办法:如果确定提示的信息里面的信号不是我们需要的,那么我们可以屏蔽这个信号,使程序可以继续进行下去。
    解决:在进入gdb调试输入命令时,最先输入下面一行命令,屏蔽SIGILL信号
    handle SIGILL nostop print
    如果不想看见相关的信息,使用下面命令:
    handle SIGILL nostop noprint
    
    设置调试程序的参数
    set args -platform eglfs
    handle SIGILL nostop print
    
    handle SIGINT stop print
    
    查看gdb对信号的处理:
    info handle
    
    查看线程信息:
    info threads
 
gdb调试时,遇到mmcqd:0/3进程一直在运行    kswapd0进程一直运行,导致gdb加载程序耗时太久
    问题原因:这个原因是因为内存不足,kswapd0使用一部分的物理内存。但是我们又没有设置swap分区,所以导致kswapd0进程一直运行,gdb一直在加载程序
    解决办法:  1、添加swap分区。//附件1有swap分区的添加方法
                2、屏蔽/etc/rc.local里面的echo 30000 >  /proc/sys/vm/min_free_kbytes
    
    
设置内核产生core文件:这个文件用来保存程序运行的环境:
    ulimit -c                    //查看是否允许生成core文件,如果为0,则不允许
    ulimit -c unlimited            //设置允许生成core文件,并且不限制大小
    ulimit -c size                //设置允许产生core文件,但是大小限制为size,单位是区块        
 
fsck命令说明:
	返回值:
	0	没有错误
	1	文件系统错误更正
	2	系统应该重启
	4	系统错误没有更正
	8	操作错误
	16	语法错误
	32	用户取消fsck
	128	共享库错误
    
scp命令使用:
    从本地到服务器:scp test.txt liuqidong@10.4.2.214:/nfs                        #将本地的test.txt文件复制到远程服务器10.4.2.214的IP地址下面的 /nfs 目录下,使用的是liuqidong这个用户进行的连接
    从服务器到本地:scp liuqidong@10.4.2.214:/nfs/gmain /                        #将远程服务器上 10.4.2.214 的IP地址下面的 /nfs 目录下的 gmain文件复制到本地的根目录下
	注:Windows平台也可以使用scp进行数据的传输
	        
查看当前有哪些USB设备:
    cat /sys/kernel/debug/usb/devices
 
统计当前文本里面某个单词出现的次数:
    cat test.txt | awk '{for(i=1;i<=NF;++i)if($i=="Mouse") ++sum}END{print sum}'     #统计Mouse出现的次数 这里的Mouse是一个单词,而不能是 AMouse,这样是统计不到的。
        
        
读取串口信息:
    cat /proc/tty/driver/IMX-uart                    #IMX-uart IMX6的内置串口相关属性,cat IMX-uart属性,可以得到如下信息:
serinfo:1.0 driver revision:
0: uart:IMX mmio:0x02020000 irq:58 tx:12174 rx:537 RTS|DTR|DSR|CD
1: uart:IMX mmio:0x021E8000 irq:59 tx:0 rx:0 DSR|CD
2: uart:IMX mmio:0x021EC000 irq:60 tx:0 rx:0 DSR|CD
3: uart:IMX mmio:0x021F0000 irq:61 tx:0 rx:0 DSR|CD
4: uart:IMX mmio:0x021F4000 irq:62 tx:150 rx:0 RTS|DTR|DSR|CD
        
        
        
统计当前文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l
 
统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l
 
统计当前文件夹下文件的个数
ls -l |grep "^-"|wc -l
 
统计当前文件夹下目录的个数
ls -l |grep "^d"|wc -l
附:
统计输出信息的行数
wc -l
 
将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d
grep "^-"    
 
grep 按文件的顺序搜索关键字,并保存到aaaaa文件里面
grep -e "Booting Linux" -e "Virtual kernel" com14_K18_3_10_28.log >> aaaaa
 
grep -v "key"        //筛选出没有key关键字的行
        
查看GPU内存大小:
    cat /sys/kernel/debug/gc/meminfo
修改GPU内存大小:
    1、GPU内存是从CMA里面申请的,因此必须要CMA的内存大于GPU的内存。在内核配置的时候可以设置CMA内存。在menuconfig时搜索:cma_size。然后进行修改
    2、在内核源码 ./driver/mxc/gpu-viv/hal/os/linux/kernel/platform/freescal 目录
    3、修改步骤2目录下的:gc_hal_kernel_platform_imx6q14.config 文件里面的EXTRA_CFLAGS += -DgcdFSL_CONTIGUOUS_SIZE 的值
GPU防锯齿配置:
    export FB_MULTI_BUFFER=2
    export FB_MULTI_BUFFER=3

获取Linux系统启动时间:
	 可以使用/proc/uptime:cat /proc/uptime
    
读取CPU温度:
    cat /sys/class/thermal/thermal_zone0/temp         //cat得到的值除以1000就是温度
        
IMX6 关闭/显示fb blank
    echo 0 > /sys/class/graphics/fb0/blank            //打开fb0 blank显示
    echo 1 > /sys/class/graphics/fb0/blank            //关闭fb0 blank显示
        
uboot 烧录:
    在Linux里面,可以使用命令直接将uboot烧录到eMMC上面:
    dd if=u-boot.imx of=/dev/mmcblk3boot0 bs=512 seek=2
    但是默认情况下,mmcblk3boot0只有只读属性,为了保护系统。因此在烧录之前,需要修改mmcblk3boot0的属性
    echo 0 > /sys/block/mmcblk3boot0/force_ro        //更改为非只读的属性
    echo 1 > /sys/block/mmcblk3boot0/force_ro        //更改为只读的属性
    完整步骤:
    echo 0 > /sys/block/mmcblk3boot0/force_ro
    dd if=u-boot.imx of=/dev/mmcblk3boot0 bs=512 seek=2    
    echo 1 > /sys/block/mmcblk3boot0/force_ro    
    
查看Linux程序打开了哪些文件:
    ls -l /proc/1234/fd
    每一个进程在/proc目录下都对应有一个数字的文件夹。这个数字文件夹其实就是根据进程PID进行命名的。
    进入到带目录下的fd目录下。又会发现好多以数字命名的软连接。使用ls -l查看,可以知道具体链接的是哪些文件。这些文件就是我们程序运行时打开的文件。

Linux系统里面查看设备树相关信息:
	设备树信息存放路径:
		/proc/device-tree			//这个目录存放的是dts根目录下面的信息
		/proc/device-tree/soc		//这个目录存放的是soc目录下的信息,soc也是一个目录,下面有更多的外设节点,各自对应一个目录
	
	
        
 
cpulimit编译使用方法:
    编译方法:
        1、下载源码,并解压。
        2、进入src目录,修改里面的Makefile。
            修改CC?=arm-linux-gnueabihf-gcc
            将所有的 $CC 全部替换为 arm-linux-gnueabihf-gcc
                            
            tests目录也是进行一样的操作。
        3、make
        4、然后在src目录里面就可以看到我们需要的cpulimit可执行文件了
        
    使用方法:
        1、./cpulimit -l 50 -e ./a.out         //限制程序a.out的CPU占用率不能超过50%    
        2、./cpulimit -l 50 -p 1234            //限制PID为1234的进程其CPU占用率不能超过50%
        
情况uboot环境变量,将其设置为默认的环境变量:
    env default -f -a
    save
    reset
 
uboot阶段,mmc相关命令操作:
    1、查看mmc信息:mmcinfo
    2、查看mmc资源:mmc list
    3、切换mmc:mmc dev 2        //切换到第二个mmc。mmc从0开始计数
              : mmc dev 2 1        //切换到第二个mmc的第一个分区
    4、查看boot在哪个分区:mmc bootpart
    5、查看mmc的分区情况:mmc part
    6、读取mmc的数据到内存上:mmc read addr blk# cnt    //addr 内存的地址  blk 读取block位置,这个位置是mmc的0地址的偏移量,十六进制表示,单位是一块字节数。cnt 读取blk的个数  cnt的单位是512字节
        示例:    mmc dev 3 0    //切换到第三个mmc的第0个分区
                mmc read 0x10800000 0x600 0x10    //从第三个mmc的第600个块位置开始读,读取0x10块大小的数据到内存0x10800000处
    7、将内存上的数据写入到mmc里面:mmc write addr blk# cnt    //addr 内存的地址  blk 读取block位置,这个位置是mmc的0地址的偏移量,十六进制表示,单位是一块字节数。cnt 读取blk的个数    cnt的单位是512字节            
        示例:    mmc dev 3 0    //切换到第三个mmc的第0个分区
                mmc write 0x10800000 0x600 0x100    //从内存0x10800000处,读取0x100个块大小的数据写入mmc里面,从mmc偏移位置600开始写
    8、擦除mmc里面的内容:mmc erase blk# cnt    //blk 擦除的起始位置        cnt 擦除的块数    cnt的单位是512字节
    
    9、查看fat分区里面的文件信息:fatls mmc 0:1        //查看第0个mmc里面的第一个分区里面的文件信息,可以看见文件名、文件大小信息
    10、从fat分区里面读文件到指定的内存地址: fatload mmc 0:1 0x10800000 zImage        //读取第0个mmc里面的第一个分区里面的zImage文件到内存0x10800000处
    11、将内存里面的数据保存到fat分区里面的一个文件里面: fatwrite mmc 0:1 0x10800000 file 0x123    //从内存0x10800000处读取0x123个字节保存到第0个mmc的第一个分区里面的file文件里面
    12、针对ext文件格式,uboot还有:ext2load ext2ls ext4load ext4ls ext4size ext4write 等命令,和fat使用方式相同    
uboot阶段,内存相关命令操作:
    1、查看对应内存的值:md addr cnt        //查看从内存地址add开始,cnt大小的内存里面的值 cnt的单位是32bit
                        md 0x10800000 10
    
    2、向内存写数据:mw addr value con        //向起始addr里面写入值为value的数据,写入的数据量为cnt cnt的单位是32bit
                    mw 0x10800000 0 10

uboot切换硬件分区:
	mmc dev 0 0		//切换到第0个mmc设备的第0个硬件分区,eMMC的第0个硬件分区就是UDA(user data area)
	mmc dev 0 1		//切换到第0个mmc设备的第1个硬件分区,eMMC的第1个硬件分区就是boot0
	mmc dev 0 2		//切换到第0个mmc设备的第2个硬件分区,eMMC的第1个硬件分区就是boot1
	mmc dev 0 3		//切换到第0个mmc设备的第3个硬件分区,eMMC的第1个硬件分区就是RPMB


  
eMMC boot分区使能/失能
使能写:
echo 0 > /sys/block/mmcblk0boot0/force_ro

失能写:
echo 1 > /sys/block/mmcblk0boot0/force_ro
 
                    
nand flash相关操作命令:
    nand erase 60000 1000                    
uboot阶段查看U盘信息:
    初始化USB设备:usb start
    查看USB设备信息:usb info
    查看U盘信息:usb storage            //这条命令可以查看有几个USB储存设备,并给每个USB储存设备进行了编号。 Device 0:    Device 1:
    查看USB储存设备里面的内容:fatls usb 0        //查看编号为0的USB存储设备里面的内容。这儿的编号可以通过usb storage查看
 
uboot阶段,nandflash相关命令操作:
    查看nandflsh信息:nand info
                        nand device
    读取命令:
        nand read addr off size            //从nand的off地址开始读取size大小数据到内存addr处
        nand read.oob addr off size        //读取一页数据里面的oob数据
    读取完整的页:
        nand dump addr size    
    写flash:
        nand write addr off size        //将内存地址addr的size大小数据写入到flash的off偏移地址去,该命令会自动跳过坏块。
        
fastboot命令说明:
	fastboot  flashing  unlock    							//设备解锁,开始刷机
	fastboot  flashing lock    								//设备上锁,刷机完毕
	注:低版本解锁和加锁命令:fastboot oem lock 和  fastboot oem unlock
	fastboot  flash  boot  boot.img    						//刷入 boot 分区
	fastboot  erase  boot									//擦除boot分区
	fastboot  format  data									//格式化data分区	
	fastboot  continue    									//自动重启设备
	fastboot -S 300M flash system system.img     			//解决fastboot 刷 system.img 尺寸限制问题
	
	fastboot erase system -w 								//擦除system分区 擦除 userdata分区和cache分区
	fastboot erase system 									//擦除system分区

                    
上网账号:
    账号:vm06     
    密码:abc+123                    
                    
音频测试:
用这个命令设置音量:amixer set PCM 80
用这个命令播放声音:aplay ./resource/audio/start.wav
如果能播放出声音,说明喇叭没有问题,如果程序中无法播放声音就是代码的问题了。
 
挂载nfs时提示如下信息:
    mount.nfs: an incorrect mount option was specified
解决办法如下:
    mount -t nfs -o nolock,nfsvers=3,vers=3 10.4.2.233:/image-file /nfs
    mount -t nfs -o nolock,nfsvers=3,vers=3 10.4.2.233:/addDisk /nfs
 
查看CPU当前处于的模式状态:
    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
重新挂载跟文件系统:
    mount -o rw,remount /
 
查看应用程序在哪个CPU上面运行:
    方法一:ps -o pid,psr,comm -p 441        //PSR列就是CPU编号
    方法二:ps -eF                            //PSR列就是CPU编号
 
脚本里面第一行:#!/bin/sh -e
#!/bin/sh -e    // -e 表示如果执行某条命令返回非0 ,那么脚本自动结束。脚本里面默认返回0是正确的。
 
 
Linux同时创建多个目录、文件:
目录:mkdir /sd[a..g]        //同时创建sda、sdb...sdg
 
文件:touch /file{1..20}    //创建20个文件。file1...file20
 

Linux查看系统IO占用情况的命令:
	pidstat -d 1	//每隔一秒打印一次信息,输出的信息如下:
	12:36:25      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
	12:36:26        0       487      0.00    640.00      0.00       0  jbd2/mmcblk0p50
	12:36:26        0     12281      0.00  38400.00      0.00       0  cp
 	
	pidstat -d 1 -p 123	//查看进程ID为123的IO占用情况
关闭ARM 开关机是openembabbed进度条读取:
在 /etc/init.d 目录下存在1个脚本: psplash.sh        这个脚本是启动/关闭 openembabbed 服务
在 /etc/rcS.d 目录下,存在一个软连接 S00psplash.sh 指向 /etc/init.d/psplash.sh
在 /etc/rc6.d 目录下,存在一个软连接 K20psplash.sh 指向 /etc/init.d/psplash.sh
 
wpa_cli命令:
 
scan                    //扫描
scan_results            //查看扫描结果
add_network                //添加网络
 
将bmp格式的图片生成PPM格式的图片:
    bmptopnm comen.bmp | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut2241.ppm
    bmptopnm comen_k1.bmp | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut2241.ppm
    bmptopnm 1111.bmp | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut2241.ppm
    bmptopnm comen_1280-800.bmp | ppmquant -fs 224 | pnmtoplainpnm > k12_24.ppm
    bmptopnm K15_24.bmp | ppmquant -fs 224 | pnmtoplainpnm > k15_24.ppm
 
Linux里面logo存放的路径:drivers/video/logo/    
    
Linux里面递归删除文件:
    find  ./ -name "testfile" | xargs rm -f        //在当前目录及其子目录下查找
 
Linux查看应用程序依赖的库:
     readelf -ld /bin/ls            //查看ls依赖的库文件
 
      
Linux查看时钟频率:
    cat /sys/kernel/debug/clk/eim_root_clk/clk_rate
 
查看CPU唯一ID的指令:
cat /sys/fsl_otp/HW_OCOTP_CFG0      
      
查看CPU频率的指令:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
 
查看CPU当前处于什么模式:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
更改CPU模式:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
interactive:CPU直接上最高频率,然后看CPU负荷再慢慢降低
conservative :保守模式,和ondemand模式很相似,只是conservative模式在调节CPU频率时相对缓慢,比较省电
ondemand :定期检查负载,根据负载来调节频率
userspace :可以在用户空间手动调节频率
powersave :以最低频率
performance:最佳性能
 
K1千兆网不能使用的原因:网络可以使用,只是默认网关被更改了,所以就连接不上我们的服务器了
    解决办法:更改网关的服务是/etc/rc5.d目录下面的 S05connman ,将S05connman重命名为TS05connman
    mv /etc/rc5.d/S05connman /etc/rc5.d/TS05connman
 
Linux设置fb是否显示、休眠:
echo 0 > /sys/class/graphics/fb0/blank        //唤醒fb0
echo 1 > /sys/class/graphics/fb0/blank        //休眠fb0
 
 
#清空缓存
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
 
查看路由表信息:
    route -n
添加默认网关:
    route add default gw 10.4.5.1    
删除默认网关:
    route del default gw 10.4.5.1

删除路由:
	route del -net 192.168.1.0 netmask 255.255.255.0 dev eth0
 
查看内核event相关事件:evtest

vi vim:
    跳转到指定行: :n        //输入 “:”,然后输入数字即可
vi 高亮搜索的字符:
    set hlsearch
vi 取消高亮搜索字符:
    set nohlsearch    
vi 删除空白行:
    g/^s*$/d    
vi 向上搜索:N
    向下搜索:n    
vi 替换字符串
	%s/aaa/bbb/g	//将所有的aaa替换成bbb
 
提取一个文件的第n列
    cat file | awk '{print $n}'    
 
打印file文件里面包含“hello”字符串的行及前面n行
    cat file | grep "hello" -Bn    
 
打印file文件里面包含“hello”字符串的行及后面n行
    cat file | grep "hello" -An    
 
打印file文件里面包含“hello”字符串的行及前后n行
    cat file | grep "hello" -Cn    
    
shell:    
    删除file文件含有abcd字符串的行
    sed    -e '/abcd/d' file > file1


shell 文件表达式
	-e filename 如果 filename存在,则为真
	-d filename 如果 filename为目录,则为真 
	-f filename 如果 filename为常规文件,则为真
	-L filename 如果 filename为符号链接,则为真
	-r filename 如果 filename可读,则为真 
	-w filename 如果 filename可写,则为真 
	-x filename 如果 filename可执行,则为真
	-s filename 如果文件长度不为0,则为真
	-h filename 如果文件是软链接,则为真
    
NXP官网源码地址:
    https://source.codeaurora/external/imx/
    
Linux查看所有的中断:
    cat /proc/interrupts  
Linux查看中断响应由哪几个CPU负责:
    cat /proc/irq/64/smp_affinity        //查看中断号为64的中断由几个CPU响应
    如果返回是3:表明由CPU0和CPU1负责响应。 0x03    一位代表一个CPU
    
在Ubuntu上编译freetype的example1.c代码:
    gcc example1.c -lm -lfreetype
运行freetype的example1.c代码对应的程序
    ./a.out msyh.ttf A
 
查看某个文件夹是什么文件系统:
    1、df -T
    2、mount
    
用正确大小的开机图片,将图片制作成.ppm文件。
    转换BMP图片:注-这种转换出来的图片有点问题
        $bmptoppm K1.bmp > 1.ppm //生成ppm
        $ppmquant 224 1.ppm >2.ppm //转换成224颜色
        $pnmnoraw 2.ppm > logo_linux_clut224.ppm //转换成ascii格式    
        
    转换png图片:注-K1通过这种方式是OK的
        pngtopnm K15_24.png > a.pnm
        pnmquant 224 a.pnm > b.pnm
        pnmtoplainpnm b.pnm > logo_linux_clut224.ppm
    
arm查看分辨率和刷新率:    注:刷新频率受时钟频率影响
cat /sys/class/graphics/fb0/modes
    
ssh使用top命令失败:
    export TERM=linux
    
调试QT程序的时候,进程mmcqd/3一直运行,导致QT加载程序内容很慢,可以尝试屏蔽掉/etc/rc.local里面如下内容:
    echo 30000 >  /proc/sys/vm/min_free_kbytes        //这一行设置了最小内存,当空闲内存小于这里设置的内存时,CPU就会置换内存里面的内容
                                                    //min_free_kbytes文件表示强制Linux VM最低保留多少空闲内存(Kbytes)
 
HDMI的热插拔检测:
    1、通过HDMI对应的中断可以来判断HDMI是否插入:cat /proc/irq/147/spurious        奇数插入,偶数拔出
    2、读取edid的值。如果没有插入过,那么edid全为0             //这种只能判断第一次 edid是每个HDMI带有的信息
    3、cat /sys/bus/platform/devices/20e0000.hdmi_video/cable_state        //拔出-plugout  插入-plugin
 
反编译dtb文件:
    ./scripts/dtc/dtc -I dtb -O dts am335x-evm2.dtb -o mytest.dts
    dtc在内核目录的:./scripts/dtc/ 路径
 
secureCRT设置日志时间:
    %M:%D:%h:%m:%s:%t        //月日时分秒毫秒
    
shell多行注释:
#!/bin/sh
ls
ls
:<<!
ls
ls
!    
 
IMX OTG驱动挂载命令:
insmod g_mass_storage.ko file=/dev/mmcblk2p3 stall=0 removable=1
insmod g_mass_storage.ko file=USB stall=0 removable=1
insmod g_mass_storage.ko file=/usbfile stall=0 removable=1    //指定哪一个分区作为OTG对应的磁盘空间
OTG功能流程说明:
    K1板安装对应的OTG驱动时,指定对应的磁盘空间。然后可以向对应的磁盘空间里面写数据。写完之后需要同步 sync
    大主机的USB口连接上K1的OTG时,会将其识别为一个U盘。通过mount挂载命令挂载该U盘。然后可以读取里面相关的内容。
    注:1、同步数据时,K1应该先执行sync命令。这样才能确保数据保存到磁盘上面了。
        2、大主机读数据时,只能读取到K1 执行sync命令之前的数据。如果K1更新了数据,大主机需要重新挂载才能读取到新的数据。
 
控制网络相关命令:
    关闭网络自协商命令:ethtool -A eth0 autoneg off
    开启网络自协商命令:ethtool -A eth0 autoneg on
 
 
Linux查看程序运行的时间:
    ps -p PID -o lstart        //PID是进程的PID号    这条命令是查看程序是什么时候启动的
    date                    //获取当前的时间    通过当前时间和程序驱动的时间,可以计算程序运行的时间
 
Linux查看系统运行的时间:
    方式一:top命令,查看up后面跟的数值。如top - 00:46:36 up 1 day, 18:42,  1 user,  load average: 1.50, 0.83, 0.61        表示系统运行1天+18小时+42分钟
    方式二:cat /proc/uptime    //改命令输出两个数值,如:153779.61 258457.82    第一个数值就是系统运行的时间。
    方式三:ps -p 1 -o lstart    //这里是查看init进程运行了多久。系统起来后,第一个启动的就是init进程。因此该进程运行的时间约等于系统运行的时间
	方式四:w					//查看系统运行的时间 13:40:55 up 76 days, 19:49, 16 users,  load average: 1.41, 1.10, 0.98
    
屏幕调试先决条件:
1、硬件上是否兼容
 
 
ubuntu上使用valgrind,打开终端,进入可执行程序路径,执行以下命令:
export LIBGL_ALWAYS_SOFTWARE=1
CM_LD_LIBRARY="$PWD/../ExternalLibs/lib/linux/fsl/$DEBUG_AND_RELEASE/"
export LD_LIBRARY_PATH="$PWD":"$PWD/libs":$CM_LD_LIBRARY:$LD_LIBRARY_PATH
valgrind --leak-check=full ./KMonitor
系统退出时,就会打印在系统退出时还没有释放的内存    
 
 
复制当前文件夹的前250个文件到/usr/lib目录里面:
ls | head -n 100 | xargs -i cp -drf {} /usr/lib    
ls | head -n 500 | xargs -i cp -drf {} /usr/lib    
 
复制当前文件夹的后250个文件到/usr/lib目录里面:
ls | tail -n 250 | xargs -i cp -drf {} /usr/lib    
 
 
ls | head -n 100 | xargs -i mv {} /usr/lib    
 
I2C调试工具:
1、 i2cdetect    
    i2cdetect -l//检测有几组I2C总线在系统上
    i2cdetect -r -y 1    //检测I2C-1上面的挂载情况
2、 i2cdump
    i2cdump -f -y 1 0x20    //查看I2C-1总线上面 0x20设备的所有寄存器的值
3、 i2cget
    i2cget -f -y 1 0x20 0x77    //查看I2C-1总线上面,0x20设备的0x77寄存器的值
    i2cget -f -y 2 0x2a 0x00
4、 i2cset
    i2cset -f -y 1 0x20 0x77 0x3f    //设置I2C-1总线上面,0x20设备的0x77寄存器的值为0x3f
    i2cset -f -y 0 0x08 0x1a 0x0f
5、	i2ctransfer
	i2ctransfer -f -y 2 w2@0x60 0x00 0x0d r1 (其中参数2为i2c2,w2表示写两个字节,@0x60为你的i2c设备(注意要7位地址),0x00 0x0d 为高低位地址,r1为读取的数据是一个byte。)
 	i2ctransfer -f -y 2 w2@0x40 0x00 0x01 r1
Linux使用命令设置串口波特率
    stty -F /dev/ttymxc2 ispeed 115200 ospeed 115200 cs8  
    stty -F /dev/ttymxc2 ispeed 230400 ospeed 230400 cs8  
    //ispeed 设置输入波特率:115200
    //ospeed 设置输出波特率:115200
    //cs8 设置字符大小为8    csN:N表示字符大小(5-8)

Linux更新分区表命令:
	blockdev --rereadpt -v /dev/sdb			//这个在820A平台上面实测可行
	hdparm -z /dev/sdb
	partprobe /dev/sdb
 
查看程序打开的文件信息,可以执行如下命令:
ls -l /proc/277/fd            //注:这里的277是进程ID号    
    
设置根文件系统为只读模式:
    修改/etc/init.d/checkroot.sh文件里面 rootmode的值,设置为 rootmode=ro
 
对磁盘进行格式化时:指定inode的数量
    mkfs.ext3 /dev/sda1 -N 18276352            //指定inode的数量为 18276352    
     mkfs.vfat -F 32 /dev/mmcblk2p1            //指定格式化成fat32格式,这样是为了解决大容量存储时的报错
 
IVD-IMX6:背光控制
    /sys/devices/soc0/backlight.31/backlight/backlight.31/brightness    背光控制文件
      
windows连接远程桌面:
    win+r    然后输入:mstsc
 
dos操作命令:
	查看文件内容:type filename
ubuntu中adb shell出现insufficient permissions for device问题:
	解决办法
		第一步:cd /etc/udev/rules.d/
		第二步:sudo touch 51-android.rules
		第三步:在上一步创建的文件中加入以下内容SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"


统计进程占用百分比总和:
	ps aux | grep -v 'RSS TTY' | awk '{print $4}'  | awk 'BEGIN{sum=0.0} {sum+=$0} END{print sum}'

统计vmalloc申请的内存:
	grep vmalloc /proc/vmallocinfo  |awk '{total+=$2};END {print total}'

adb上传下载文件:
adb push命令 :从电脑上传送文件到手机
	adb push D:\share\file.txt /data			//拷贝D盘share目录下面的file.txt文件到板卡的/data目录下面
	adb push D:\share\boot.img /
	adb push D:\share\lqd_abctl /
	adb push D:\share\libais_mx9286.so /
	adb push D:\share\zros.tar.gz /

查看设备列表:adb devices
选中设备:adb -s 设备号 						//adb -s 9da9101a shell
adb 提示:error: device offline
	解决办法:	adb kill-server					//一般只执行这个命令就行
				
				
				adb remount
mount -o remount,rw /

adb pull命令 :从手机传送文件到电脑上
	adb pull /data/file.txt D:\share			//拷贝板卡/data目录下面的file.txt文件到电脑的D盘下面share目录

fastboot更新程序:
	fastboot flash aboot D:\share\emmc_appsboot.mbn	//将D盘share目录下面的emmc_appsboot.mbn更新到flash上面去
	fastboot flash aboot D:\share\emmc_appsboot.mbn
	fastboot --set_active=a							//设置分区A为活动分区

bitbake:
	bitbake -c cleanall libabctl				//清空 libabctl 上一次的编译记录

vscode相关操作:
	1、查找函数 ctrl+shift+o		//或者ctrl+p,然后在搜索框里面输入@
	2、查找文件 ctrl+p
	3、格式化代码 shift+alt+f


stressapptest 使用说明:
	测试用例: ./stressapptest -M 1500 -s 10 -W  -m 4 -i 4 -f testfile
	-M	要测试的内存,MByte为单位
	-s	测试的时间,秒为单位
	-W	使用更多的CPU压测
	-m	运行内存拷贝的线程数
	-i	运行内存反转的线程数
	-f	使用tempfile添加磁盘线程

 
//================================================================    
Linux获取扇区大小:
root@imx6qsabresd:/# fdisk -l
 
Disk /dev/mmcblk3: 7.1 GiB, 7650410496 bytes, 14942208 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes                //扇区大小512Byte
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
 
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk3p1       51200   665599   614400  300M 83 Linux
/dev/mmcblk3p2      665600   686079    20480   10M 83 Linux
/dev/mmcblk3p3      686080   706559    20480   10M 83 Linux
/dev/mmcblk3p4      706560 14942207 14235648  6.8G 83 Linux
 
Disk /dev/mmcblk3boot1: 2 MiB, 2097152 bytes, 4096 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mmcblk3boot0: 2 MiB, 2097152 bytes, 4096 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@imx6qsabresd:/#  
//================================================================    
 
 
 
//================================================================    
Linux获取块大小:
方法一:
root@imx6qsabresd:/# blockdev --getbsz /dev/mmcblk3p3  
4096                                                                    //块大小4096
root@imx6qsabresd:/#  
 
方法二:
root@imx6qsabresd:/# stat -f /dev/mmcblk3p3  
  File: "/dev/mmcblk3p3"
    ID: 0        Namelen: 255     Type: tmpfs
Block size: 4096       Fundamental block size: 4096                        //块大小4096
Blocks: Total: 92754      Free: 92754      Available: 92754
Inodes: Total: 92754      Free: 92403
root@imx6qsabresd:/#  
 
方法三:
liuqidong@ubtby-35:~/lqd/program_self/c/ext3$ sudo tune2fs -l /dev/sdb1  
[sudo] liuqidong 的密码:  
tune2fs 1.42.13 (17-May-2015)
Filesystem volume name:   <none>
Last mounted on:          /addDisk
Filesystem UUID:          6fa3711a-d337-4630-b9e1-f0fd1bdd2faf
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash  
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3276800
Block count:              13106944
Reserved block count:     655347
Free blocks:              2362878
Free inodes:              3046664
First block:              0
Block size:               4096                                        //块大小4096
Fragment size:            4096
Reserved GDT blocks:      1020
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Thu Sep 12 17:35:29 2019
Last mount time:          Thu Mar  4 22:47:15 2021
Last write time:          Thu Mar  4 22:47:15 2021
Mount count:              27
Maximum mount count:      -1
Last checked:             Thu Sep 12 17:35:29 2019
Check interval:           0 (<none>)
Lifetime writes:          2082 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      c74eb384-136f-4b04-9315-898548ca661a
Journal backup:           inode blocks
liuqidong@ubtby-35:~/lqd/program_self/c/ext3$  


//================================================================    
 
comen共享网络磁盘:\\comennasen
//================================================================    
/*附件1:添加swap分区*/    
一、新建磁盘分区作为swap分区//这种方式没有亲测
1. # swapoff -a #停止所有的swap分区
2. 用fdisk命令(例:# fdisk /dev/sdb)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。
3. # mkswap /dev/sdb2 #格式化swap分区,这里的sdb2要看您加完后p命令显示的实际分区设备名
4. # swapon /dev/sdb2 #启动新的swap分区
5. 为了让系统启动时能自动启用这个交换分区,可以编辑/etc/fstab,加入下面一行
/dev/sdb2 swap swap defaults 0 0    
 
二、用文件作为Swap分区//这种方式1-3步已经测试OK,第4步没有测试
1.创建要作为swap分区的文件:增加10GB大小的交换分区(原理的swap分区不变),则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
# dd if=/dev/zero of=/root/swapfile bs=1M count=10240
2.格式化为交换分区文件:
# mkswap /root/swapfile    #建立swap的文件系统
3.启用交换分区文件:
# swapon /root/swapfile     #启用swap文件
4.使系统开机时自启用,在文件/etc/fstab中添加一行:
/root/swapfile swap swap defaults 0 0
//================================================================    
    
    
//================================================================    
/*附件2:屏幕行场频对应关系*/
3.     u32 refresh;        60    /* 刷新频率 */   
4.     u32 xres;           1024  //行像素   
5.     u32 yres;           768   //列像素   
6.     u32 pixclock;       19528(14065) //时钟频率,单位ps,14430   
7.     u32 left_margin;    140   // HBPD(horizontal back porch):80   
8.     u32 right_margin;   160   // HFPD(horizontal front porth):48   
9.     u32 upper_margin;   20    // VBPD(vertical back porch),15   
10.    u32 lower_margin;   12    // VFBD(vertical front porch),2   
11.    u32 hsync_len;      20    // HSPW(horizontal sync pulse width):32   
12.    u32 vsync_len;      3     // VSPW(vertical sync pulse width):47  
//================================================================    
 
//================================================================    
/*附件3:计算pixclock像素时钟和帧率*/
 
dotclock是视频硬件在显示器上绘制像素的速率。
dotclock为 27MHz. 所以
pixclock = 1 / (27E6) = 3.7037037037037036e-08, 取整为37037 皮秒
帧率的计算:
帧率=dotclock / ((xres+left_margin+right_margin+hsync)*(yres+upper_margin+low_margin+vsync))
=  (27E6)/( (40 + 800 + 60 + 20) (10 + 480 + 10 + 10))
= 57.54475703324808, 取整为 57Hz。
xres和yres已经由硬件固定,一般屏幕的刷新率一般为60Hz,而高于刷新率的帧数都是无效帧数。所以可以根据公式调整其他参数以调整LCD帧率,使其尽量接近60fps. 如果数值设置偏差的话,可能会造成屏幕沙点,抖动现象。
//================================================================


ethtools 使用方法:
    ethtool -s eth0 speed 1000 duplex full autoneg off        //设置eth0网卡为1000M 全双工 自动协商关闭
    ethtool -s eth0 speed 100 duplex full autoneg off        //设置eth0网卡为1000M 全双工 自动协商关闭
    ethtool -s eth0 speed 10 duplex full autoneg off        //设置eth0网卡为1000M 全双工 自动协商关闭
 
 
iperf使用方法:
    iperf -s -p 5001 -i 1 -f MBytes                    //-s 以服务的方式启动  -p指定端口  -i每次报告之间的时间间隔 -f格式化带宽输出:Kbits Mbits KBytes MBytes
    iperf -c 10.4.2.233 -p 5001 -i 1 -f MBytes -R        //-c 以客户端的方式启动 后面跟服务器的IP地址 -R 服务器发送,客户端接收
    iperf -c 172.16.1.101 -p 5001 -i 1 -f MBytes -R
    
ARM上使用tftp命令下载文件:
    time tftp -g -l /zImage -r zImage 200.200.200.100        //从IP地址为200.200.200.254网络上下载zImage,并把zImage保存到根目录下,命名为zImage
    { time tftp -g -l /zImage -r zImage 10.4.2.233;} 2>>    tftp.log    //从IP地址为200.200.200.254网络上下载zImage,并把zImage保存到根目录下,命名为zImage
    
    time tftp -g -l /50M -r 50M 200.200.200.100
tftp参数说明:
基本参数:
-g:   get,获取文件
-p:   put,长传文件
-l FILE:本地的文件,名为FILE
-r FILE:远程的文件,名为FILE
 
 
eMMC读写速度测试:
    1、写速度测试:
        dd if=/dev/urandom of=/test_file bs=1M count=100 conv=fsync            //如果不加 conv=fsync,命令结束时,可能没有写到磁盘上去
 
    2、读缓存测试:
        dd if=/test_file of=/dev/null bs=1M count=100                        //没有清除缓存,那么会从缓存里面读取数据
    
    3、读磁盘测试:
        sysctl -w vm.drop_caches=3                                            //先清除缓存
        dd if=/test_file of=/dev/null bs=1M count=100                        //从磁盘里面读取数据
 
出发fsck修复:
    dd if=/dev/zero of=/dev/mmcblk0p50 bs=256 count=100 conv=fsync
 
网络设置:
    1、内核下设置IP
    设置IP地址和子网掩码:
        ifconfig eth0 10.4.5.253 netmask 255.255.255.0
        ifconfig eth0 10.4.5.20 netmask 255.255.255.0
        ifconfig eth1 10.4.5.20 netmask 255.255.255.0
    添加网关:
        route add default gw 10.4.5.1
        
    挂载nfs服务器:
        mount -t nfs -o nolock,rsize=4096,wsize=4096 10.7.0.147:/nfs /nfs
        mount -t nfs -o nolock 10.4.2.233:/nfs /nfs
        mount -t nfs -o nolock 10.4.2.233:/addDisk /nfs
    卸载nfs服务器:
        umount /nfs
    强行卸载nfs服务器:
        umount -fi /nfs
 
判断文件夹是否被挂载:
    grep '/mnt' /proc/mounts        //挂载相关的信息都会记录在/proc/mounts文件里面        
        
    2、uboot下设置IP
    setenv ipaddr   "10.4.5.20"                        //设置本地IP地址
    setenv serverip "10.4.2.214"                        //设置服务器IP地址
    setenv netmask "255.255.255.0"                        //设置子网掩码
    setenv gatewayip "10.4.5.1"                            //设置网关
    setenv ethaddr "AA:BB:CC:DD:EE:FF"                    //本地物理地址(MAC)
 
    修改mac地址:
ifconfig  eth0 down
ifconfig eth0 hw ether 4A:80:26:1E:2C:8D
ifconfig eth0 up
设置MAC地址注意事项:
    P地址分为三类:广播,组播和单播。
    广播就是:FF:FF:FF:FF:FF:FF。
    组播:第一字节最后一位是1,如47:72:65:65:6e:00,47的最后一位是1.
    单播:第一字节最后一位是0,如48:72:65:65:6e:00,48的最后一位是0.
 
 
    
RTC相关操作:
    date -s "2018-05-17 20:10:10"                        //设置时间
    date -s "2019-12-12 08:42:42"
    
    date -s "2019-07-10 09:01:00"                        //设置时间
    date -s "2019-07-16 14:47:50"                        //设置时间
    date -s "2020-11-30 13:50:40"                        //设置时间
    hwclock -w                                            //将时间写入RTC硬件里面
    
    hwclock --show                                        //读取RTC硬件时钟
将date命令的输出进行格式化:
    date -u +%4Y%2m%2d%2H%2M%2S                            //输出年月日时分秒 如:20100102020202 2010年1月2日2时2分2秒
        
        
uboot查看内存内容的命令:
    md addr size                    //示例: md 12c00000 128 查看从12c00000处开始的,大小为128的内存的内容
    mw addr startoffect end offect    //示例: mw 12c00000 0 128 从12c00000开始,将偏移地址0-128之间的内存内容修改为0
        
终端信息重定向:
    1、终端不显示,只保存文件
    ls >> ./test.log    #以追加的方式保存
    ls >  ./test.log    #以覆盖的方式保存
    
    1、终端显示,同时也保存到文件
    ls | tee -a ./test.log    #以追加的方式保存
    ls | tee ./test.log        #以覆盖的方式保存
        
        
svn 下载指定版本的代码:
    样板:svn co addr -r vresion
    示例:svn co https://rden:8443/svn/CM_Software/K_Monitor/SourceCode/trunk -r 123  
        解释:从服务器https://rden:8443/svn/CM_Software/K_Monitor/SourceCode/trunk上面,下载版本号为123的源码
        
        
git 的基本操作:
    git config --global user.name qidong.liu                    //git配置用户名
    git config --global user.email qidong.liu@zongmutech    //git配置用户邮箱
    git config user.name                                         //git查看用户名
    git config user.email                                        //git查看用户邮箱
    下载远程代码:git clone addr        //add 是远程仓库的地址
    在本地创建分支,并下载远程分支: git checkout -b dev(本地分支名称) origin/dev(远程分支名称)            //克隆远程分支origin/dev,并且在本地分支将其命名为dev
    查看分支:git branch
    查看远程分支:git branch -r
    查看所有分支:git branch -a
    在本地创建分支dev:git branch dev
    切换到分支dev:git checkout dev
    创建分支dev并切换到该分支:git checkout -b dev
    查看日志信息:git log
    查看分支日志信息:git log branch
    查看当前的状态:git status                            //这条命令会将当前git目录下所有的更改、新建的文件信息列举出来。这里新建的文件会提示没有添加到git版本里面
    查看当前的状态:git status -uno                        //这条命令只会列举已经添加到版本控制器里面的文件作出的对应的改动
    查看合并代码(merge)后,哪些文件有冲突:git status -s   //这条命令,查看合并代码后,哪些文件有冲突需要手动解决
    删除本地分支:git branch -d dev                        //dev是我们要删除的分支    
    删除远程分支:git push origin -delete dev            //dev是我们的远程分支
    撤销git add 的文件:git reset HEAD file                //我们已经使用了add命令,但是没有commit提交
    撤销尚未git add 文件的修改:git check -- file        //这里加上“--”表示是check文件,不加“--”,当文件和分支同名时,check时,默认check的是分支
    git搭建服务器:sudo git init --bare issue            //issue是一个目录。我们把这个目录初始化为我们的服务器。
    git下载服务器代码:git clone liuqidong@10.4.2.233:/home/liuqidong/lqd/git/git-server/issue
    git绑定远程服务器:git remote add origin tanglianming@10.4.2.203:/home/tanglianming/lqd/temp/imx6/
    git向远程服务器master推送代码:git push -u origin master    //向远程服务器的master分支推送代码    
                                                                //如: git push origin projects/A_CA_S202/OTA4.0
    更新代码:git pull                       //已经将远程服务器的代码克隆到本地,但是服务器代码更新了。这个时候使用git pull更新最新的服务器代码到本地。
    git恢复到指定版本:git reset --hard vNUM
    查看分支tag1和分支tag2之间哪些文件发生了更改:git diff tag1 tag2 --stat
    查看分支tag1和分支tag2之间哪些文件发生了更改:git diff tag1 tag2 file1        //比较分支tag1和分支tag2 file1文件的区别
    查看git修改的详细信息:git log -p
    查看git最近两次修改的详细信息: git log -p -2
    查看某次提交具体做了哪些更改:git show commit-id
    查看每次提交主要修改了哪些文件:git log --stat        //git log --stat -2 查看最近2次提交,修改了哪些文件
                                    git log -m --name-only    //查看修改了哪些文件
    创建本地仓库:git init
    删除文件:    git rm --cached file1                //删除控制版本器里面的控制,不删除本地的文件
                git rm --f    file1                    //删除控制版本器里面的控制,同时也删除本地的文件
    将分支A的部分文件合并到分支B上面:
        1、先切换到分支B上面
        2、git check branchA file1 file2        //将分支A的file1和file2合并到分支B上面
    查看总提交次数 git log --oneline | wc -l
    查看某个用户提交次数  git log --author="用户名" --oneline | wc -l
    查看每个用户提交次数 git shortlog -s -n
    直接通过git生成patch:git format-patch 81d5a2be1411edba164b52dccb8e8a7f74c940f5 -1
    查看文件的提交记录:git log --follow filename
    查看文件的历史修改详细记录:git log --follow -p filename
    根据commit id查找所属分支:git branch --contains 6c13e2a66f90520f47766c43d1536edbd361688b --all    

repo:
    多线程同步:
        repo sync -j 24
        
开启telnet服务:
    1、将inetd、telnetd文件复制到/usr/sbin目录下面
    2、在/etc/init.d/rc_mxc.S文件里面,在 if grep 前面添加 /usr/sbin/inetd
    3、在/etc目录下创建 inetd.conf 文件,在文件里面添加:telnet stream tcp nowait root /usr/sbin/telnetd telnetd  
    重启,旋转telnet服务就可以连接成功了。
    连接命令:telnet 10.4.5.20
        
        
网络远程连接:
    ssh使用:
        ssh root@200.200.200.200        //连接IP地址为200.200.200.200网络,并使用root用户登录
        
    telnet使用:
        telnet 200.200.200.200            //连接IP地址为200.200.200.200网络
        
gdb不能调试的问题:
    运行gdb程序,提示如下错误信息:
    Could not find platform independent libraries <prefix>
    Could not find platform dependent libraries <exec_prefix>
    Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
    ImportError: No module named site
        
    解决办法:将gdb_lib复制到开发板/usr目录下,同时添加如下环境变量:    
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/gdb_lib
    export PYTHONHOME=/usr/gdb_lib/python2.7
    export PYTHONPATH=/usr/gdb_lib/python2.7
        
    gdb调试程序的过程中,遇到信号导致调试停止,错误信息如下:    
    Program received signal SIGILL, Illegal instruction.
    0x6a8ff2a8 in ?? () from /lib/libcrypto.so.1.0.0
    
    解决办法:如果确定提示的信息里面的信号不是我们需要的,那么我们可以屏蔽这个信号,使程序可以继续进行下去。
    解决:在进入gdb调试输入命令时,最先输入下面一行命令,屏蔽SIGILL信号
    handle SIGILL nostop print
    如果不想看见相关的信息,使用下面命令:
    handle SIGILL nostop noprint
    
    设置调试程序的参数
    set args -platform eglfs
    handle SIGILL nostop print
    
    handle SIGINT stop print
    
    查看gdb对信号的处理:
    info handle
    
    查看线程信息:
    info threads
 
gdb调试时,遇到mmcqd:0/3进程一直在运行    kswapd0进程一直运行,导致gdb加载程序耗时太久
    问题原因:这个原因是因为内存不足,kswapd0使用一部分的物理内存。但是我们又没有设置swap分区,所以导致kswapd0进程一直运行,gdb一直在加载程序
    解决办法:  1、添加swap分区。//附件1有swap分区的添加方法
                2、屏蔽/etc/rc.local里面的echo 30000 >  /proc/sys/vm/min_free_kbytes
    
    
设置内核产生core文件:这个文件用来保存程序运行的环境:
    ulimit -c                    //查看是否允许生成core文件,如果为0,则不允许
    ulimit -c unlimited            //设置允许生成core文件,并且不限制大小
    ulimit -c size                //设置允许产生core文件,但是大小限制为size,单位是区块        
 
fsck命令说明:
    返回值:
    0    没有错误
    1    文件系统错误更正
    2    系统应该重启
    4    系统错误没有更正
    8    操作错误
    16    语法错误
    32    用户取消fsck
    128    共享库错误
    
scp命令使用:
    从本地到服务器:scp test.txt liuqidong@10.4.2.214:/nfs                        #将本地的test.txt文件复制到远程服务器10.4.2.214的IP地址下面的 /nfs 目录下,使用的是liuqidong这个用户进行的连接
    从服务器到本地:scp liuqidong@10.4.2.214:/nfs/gmain /                        #将远程服务器上 10.4.2.214 的IP地址下面的 /nfs 目录下的 gmain文件复制到本地的根目录下
        
查看当前有哪些USB设备:
    cat /sys/kernel/debug/usb/devices
 
统计当前文本里面某个单词出现的次数:
    cat test.txt | awk '{for(i=1;i<=NF;++i)if($i=="Mouse") ++sum}END{print sum}'     #统计Mouse出现的次数 这里的Mouse是一个单词,而不能是 AMouse,这样是统计不到的。
        
        
读取串口信息:
    cat /proc/tty/driver/IMX-uart                    #IMX-uart IMX6的内置串口相关属性,cat IMX-uart属性,可以得到如下信息:
serinfo:1.0 driver revision:
0: uart:IMX mmio:0x02020000 irq:58 tx:12174 rx:537 RTS|DTR|DSR|CD
1: uart:IMX mmio:0x021E8000 irq:59 tx:0 rx:0 DSR|CD
2: uart:IMX mmio:0x021EC000 irq:60 tx:0 rx:0 DSR|CD
3: uart:IMX mmio:0x021F0000 irq:61 tx:0 rx:0 DSR|CD
4: uart:IMX mmio:0x021F4000 irq:62 tx:150 rx:0 RTS|DTR|DSR|CD
        
        
        
统计当前文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l
 
统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l
 
统计当前文件夹下文件的个数
ls -l |grep "^-"|wc -l
 
统计当前文件夹下目录的个数
ls -l |grep "^d"|wc -l
附:
统计输出信息的行数
wc -l
 
将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d
grep "^-"    
 
grep 按文件的顺序搜索关键字,并保存到aaaaa文件里面
grep -e "Booting Linux" -e "Virtual kernel" com14_K18_3_10_28.log >> aaaaa
 
grep -v "key"        //筛选出没有key关键字的行
        
查看GPU内存大小:
    cat /sys/kernel/debug/gc/meminfo
修改GPU内存大小:
    1、GPU内存是从CMA里面申请的,因此必须要CMA的内存大于GPU的内存。在内核配置的时候可以设置CMA内存。在menuconfig时搜索:cma_size。然后进行修改
    2、在内核源码 ./driver/mxc/gpu-viv/hal/os/linux/kernel/platform/freescal 目录
    3、修改步骤2目录下的:gc_hal_kernel_platform_imx6q14.config 文件里面的EXTRA_CFLAGS += -DgcdFSL_CONTIGUOUS_SIZE 的值
GPU防锯齿配置:
    export FB_MULTI_BUFFER=2
    export FB_MULTI_BUFFER=3
 
    
读取CPU温度:
    cat /sys/class/thermal/thermal_zone0/temp         //cat得到的值除以1000就是温度
        
IMX6 关闭/显示fb blank
    echo 0 > /sys/class/graphics/fb0/blank            //打开fb0 blank显示
    echo 1 > /sys/class/graphics/fb0/blank            //关闭fb0 blank显示
        
uboot 烧录:
    在Linux里面,可以使用命令直接将uboot烧录到eMMC上面:
    dd if=u-boot.imx of=/dev/mmcblk3boot0 bs=512 seek=2
    但是默认情况下,mmcblk3boot0只有只读属性,为了保护系统。因此在烧录之前,需要修改mmcblk3boot0的属性
    echo 0 > /sys/block/mmcblk3boot0/force_ro        //更改为非只读的属性
    echo 1 > /sys/block/mmcblk3boot0/force_ro        //更改为只读的属性
    完整步骤:
    echo 0 > /sys/block/mmcblk3boot0/force_ro
    dd if=u-boot.imx of=/dev/mmcblk3boot0 bs=512 seek=2    
    echo 1 > /sys/block/mmcblk3boot0/force_ro    
    
查看Linux程序打开了哪些文件:
    ls -l /proc/1234/fd
    每一个进程在/proc目录下都对应有一个数字的文件夹。这个数字文件夹其实就是根据进程PID进行命名的。
    进入到带目录下的fd目录下。又会发现好多以数字命名的软连接。使用ls -l查看,可以知道具体链接的是哪些文件。这些文件就是我们程序运行时打开的文件。

Linux系统里面查看设备树相关信息:
    设备树信息存放路径:
        /proc/device-tree            //这个目录存放的是dts根目录下面的信息
        /proc/device-tree/soc        //这个目录存放的是soc目录下的信息,soc也是一个目录,下面有更多的外设节点,各自对应一个目录
    
    
        
 
cpulimit编译使用方法:
    编译方法:
        1、下载源码,并解压。
        2、进入src目录,修改里面的Makefile。
            修改CC?=arm-linux-gnueabihf-gcc
            将所有的 $CC 全部替换为 arm-linux-gnueabihf-gcc
                            
            tests目录也是进行一样的操作。
        3、make
        4、然后在src目录里面就可以看到我们需要的cpulimit可执行文件了
        
    使用方法:
        1、./cpulimit -l 50 -e ./a.out         //限制程序a.out的CPU占用率不能超过50%    
        2、./cpulimit -l 50 -p 1234            //限制PID为1234的进程其CPU占用率不能超过50%
        
情况uboot环境变量,将其设置为默认的环境变量:
    env default -f -a
    save
    reset
 
uboot阶段,mmc相关命令操作:
    1、查看mmc信息:mmcinfo
    2、查看mmc资源:mmc list
    3、切换mmc:mmc dev 2        //切换到第二个mmc。mmc从0开始计数
              : mmc dev 2 1        //切换到第二个mmc的第一个分区
    4、查看boot在哪个分区:mmc bootpart
    5、查看mmc的分区情况:mmc part
    6、读取mmc的数据到内存上:mmc read addr blk# cnt    //addr 内存的地址  blk 读取block位置,这个位置是mmc的0地址的偏移量,十六进制表示,单位是一块字节数。cnt 读取blk的个数  cnt的单位是512字节
        示例:    mmc dev 3 0    //切换到第三个mmc的第0个分区
                mmc read 0x10800000 600 10    //从第三个mmc的第600个块位置开始读,读取10块大小的数据到内存0x10800000处
    7、将内存上的数据写入到mmc里面:mmc write addr blk# cnt    //addr 内存的地址  blk 读取block位置,这个位置是mmc的0地址的偏移量,十六进制表示,单位是一块字节数。cnt 读取blk的个数    cnt的单位是512字节            
        示例:    mmc dev 3 0    //切换到第三个mmc的第0个分区
                mmc write 0x10800000 600 100    //从内存0x10800000处,读取0x100个块大小的数据写入mmc里面,从mmc偏移位置600开始写
    8、擦除mmc里面的内容:mmc erase blk# cnt    //blk 擦除的起始位置        cnt 擦除的块数    cnt的单位是512字节
    
    9、查看fat分区里面的文件信息:fatls mmc 0:1        //查看第0个mmc里面的第一个分区里面的文件信息,可以看见文件名、文件大小信息
    10、从fat分区里面读文件到指定的内存地址: fatload mmc 0:1 0x10800000 zImage        //读取第0个mmc里面的第一个分区里面的zImage文件到内存0x10800000处
    11、将内存里面的数据保存到fat分区里面的一个文件里面: fatwrite mmc 0:1 0x10800000 file 0x123    //从内存0x10800000处读取0x123个字节保存到第0个mmc的第一个分区里面的file文件里面
    12、针对ext文件格式,uboot还有:ext2load ext2ls ext4load ext4ls ext4size ext4write 等命令,和fat使用方式相同    
uboot阶段,内存相关命令操作:
    1、查看对应内存的值:md addr cnt        //查看从内存地址add开始,cnt大小的内存里面的值 cnt的单位是32bit
                        md 0x10800000 10
    
    2、向内存写数据:mw addr value con        //向起始addr里面写入值为value的数据,写入的数据量为cnt cnt的单位是32bit
                    mw 0x10800000 0 10

uboot切换硬件分区:
    mmc dev 0 0        //切换到第0个mmc设备的第0个硬件分区,eMMC的第0个硬件分区就是UDA(user data area)
    mmc dev 0 1        //切换到第0个mmc设备的第1个硬件分区,eMMC的第1个硬件分区就是boot0
    mmc dev 0 2        //切换到第0个mmc设备的第2个硬件分区,eMMC的第1个硬件分区就是boot1
    mmc dev 0 3        //切换到第0个mmc设备的第3个硬件分区,eMMC的第1个硬件分区就是RPMB

eMMC boot分区使能/失能
使能写:
echo 0 > /sys/block/mmcblk0boot0/force_ro

失能写:
echo 1 > /sys/block/mmcblk0boot0/force_ro
 
                    
nand flash相关操作命令:
    nand erase 60000 1000                    
uboot阶段查看U盘信息:
    初始化USB设备:usb start
    查看USB设备信息:usb info
    查看U盘信息:usb storage            //这条命令可以查看有几个USB储存设备,并给每个USB储存设备进行了编号。 Device 0:    Device 1:
    查看USB储存设备里面的内容:fatls usb 0        //查看编号为0的USB存储设备里面的内容。这儿的编号可以通过usb storage查看
 
uboot阶段,nandflash相关命令操作:
    查看nandflsh信息:nand info
                        nand device
    读取命令:
        nand read addr off size            //从nand的off地址开始读取size大小数据到内存addr处
        nand read.oob addr off size        //读取一页数据里面的oob数据
    读取完整的页:
        nand dump addr size    
    写flash:
        nand write addr off size        //将内存地址addr的size大小数据写入到flash的off偏移地址去,该命令会自动跳过坏块。
        
fastboot命令说明:
    fastboot  flashing  unlock                                //设备解锁,开始刷机
    fastboot  flashing lock                                    //设备上锁,刷机完毕
    注:低版本解锁和加锁命令:fastboot oem lock 和  fastboot oem unlock
    fastboot  flash  boot  boot.img                            //刷入 boot 分区
    fastboot  erase  boot                                    //擦除boot分区
    fastboot  format  data                                    //格式化data分区    
    fastboot  continue                                        //自动重启设备
    fastboot -S 300M flash system system.img                 //解决fastboot 刷 system.img 尺寸限制问题
    
    fastboot erase system -w                                 //擦除system分区 擦除 userdata分区和cache分区
    fastboot erase system                                     //擦除system分区

                    
上网账号:
    账号:vm06     
    密码:abc+123                    
                    
音频测试:
用这个命令设置音量:amixer set PCM 80
用这个命令播放声音:aplay ./resource/audio/start.wav
如果能播放出声音,说明喇叭没有问题,如果程序中无法播放声音就是代码的问题了。
 
挂载nfs时提示如下信息:
    mount.nfs: an incorrect mount option was specified
解决办法如下:
    mount -t nfs -o nolock,nfsvers=3,vers=3 10.4.2.233:/image-file /nfs
    mount -t nfs -o nolock,nfsvers=3,vers=3 10.4.2.233:/addDisk /nfs
 
查看CPU当前处于的模式状态:
    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
重新挂载跟文件系统:
    mount -o rw,remount /
 
查看应用程序在哪个CPU上面运行:
    方法一:ps -o pid,psr,comm -p 441        //PSR列就是CPU编号
    方法二:ps -eF                            //PSR列就是CPU编号
 
脚本里面第一行:#!/bin/sh -e
#!/bin/sh -e    // -e 表示如果执行某条命令返回非0 ,那么脚本自动结束。脚本里面默认返回0是正确的。
 
 
Linux同时创建多个目录、文件:
目录:mkdir /sd[a..g]        //同时创建sda、sdb...sdg
 
文件:touch /file{1..20}    //创建20个文件。file1...file20
 

Linux查看系统IO占用情况的命令:
    pidstat -d 1    //每隔一秒打印一次信息,输出的信息如下:
    12:36:25      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
    12:36:26        0       487      0.00    640.00      0.00       0  jbd2/mmcblk0p50
    12:36:26        0     12281      0.00  38400.00      0.00       0  cp
     
    pidstat -d 1 -p 123    //查看进程ID为123的IO占用情况
关闭ARM 开关机是openembabbed进度条读取:
在 /etc/init.d 目录下存在1个脚本: psplash.sh        这个脚本是启动/关闭 openembabbed 服务
在 /etc/rcS.d 目录下,存在一个软连接 S00psplash.sh 指向 /etc/init.d/psplash.sh
在 /etc/rc6.d 目录下,存在一个软连接 K20psplash.sh 指向 /etc/init.d/psplash.sh
 
wpa_cli命令:
 
scan                    //扫描
scan_results            //查看扫描结果
add_network                //添加网络
 
将bmp格式的图片生成PPM格式的图片:
    bmptopnm comen.bmp | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut2241.ppm
    bmptopnm comen_k1.bmp | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut2241.ppm
    bmptopnm 1111.bmp | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut2241.ppm
    bmptopnm comen_1280-800.bmp | ppmquant -fs 224 | pnmtoplainpnm > k12_24.ppm
    bmptopnm K15_24.bmp | ppmquant -fs 224 | pnmtoplainpnm > k15_24.ppm
 
Linux里面logo存放的路径:drivers/video/logo/    
    
Linux里面递归删除文件:
    find  ./ -name "testfile" | xargs rm -f        //在当前目录及其子目录下查找
 
Linux查看应用程序依赖的库:
     readelf -ld /bin/ls            //查看ls依赖的库文件
 
      
Linux查看时钟频率:
    cat /sys/kernel/debug/clk/eim_root_clk/clk_rate
 
查看CPU唯一ID的指令:
cat /sys/fsl_otp/HW_OCOTP_CFG0      
      
查看CPU频率的指令:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
 
查看CPU当前处于什么模式:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
更改CPU模式:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
interactive:CPU直接上最高频率,然后看CPU负荷再慢慢降低
conservative :保守模式,和ondemand模式很相似,只是conservative模式在调节CPU频率时相对缓慢,比较省电
ondemand :定期检查负载,根据负载来调节频率
userspace :可以在用户空间手动调节频率
powersave :以最低频率
performance:最佳性能
 
K1千兆网不能使用的原因:网络可以使用,只是默认网关被更改了,所以就连接不上我们的服务器了
    解决办法:更改网关的服务是/etc/rc5.d目录下面的 S05connman ,将S05connman重命名为TS05connman
    mv /etc/rc5.d/S05connman /etc/rc5.d/TS05connman
 
Linux设置fb是否显示、休眠:
echo 0 > /sys/class/graphics/fb0/blank        //唤醒fb0
echo 1 > /sys/class/graphics/fb0/blank        //休眠fb0
 
 
#清空缓存
    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches
 
查看路由表信息:
    route -n
添加默认网关:
    route add default gw 10.4.5.1    
删除默认网关:
    route del default gw 10.4.5.1
 
vi 十六进制查看文件:
    :%!xxd
vi vim:
    跳转到指定行: :n        //输入 “:”,然后输入数字即可
vi 高亮搜索的字符:
    set hlsearch
vi 取消高亮搜索字符:
    set nohlsearch    
vi 删除空白行:
    g/^s*$/d    
vi 向上搜索:N
    向下搜索:n    
vi 替换字符串
    %s/aaa/bbb/g    //将所有的aaa替换成bbb
 
提取一个文件的第n列
    cat file | awk '{print $n}'    
 
打印file文件里面包含“hello”字符串的行及前面n行
    cat file | grep "hello" -Bn    
 
打印file文件里面包含“hello”字符串的行及后面n行
    cat file | grep "hello" -An    
 
打印file文件里面包含“hello”字符串的行及前后n行
    cat file | grep "hello" -Cn    
    
shell:    
    删除file文件含有abcd字符串的行
    sed    -e '/abcd/d' file > file1


shell 文件表达式
    -e filename 如果 filename存在,则为真
    -d filename 如果 filename为目录,则为真 
    -f filename 如果 filename为常规文件,则为真
    -L filename 如果 filename为符号链接,则为真
    -r filename 如果 filename可读,则为真 
    -w filename 如果 filename可写,则为真 
    -x filename 如果 filename可执行,则为真
    -s filename 如果文件长度不为0,则为真
    -h filename 如果文件是软链接,则为真
    
NXP官网源码地址:
    https://source.codeaurora/external/imx/
    
Linux查看所有的中断:
    cat /proc/interrupts  
Linux查看中断响应由哪几个CPU负责:
    cat /proc/irq/64/smp_affinity        //查看中断号为64的中断由几个CPU响应
    如果返回是3:表明由CPU0和CPU1负责响应。 0x03    一位代表一个CPU
    
在Ubuntu上编译freetype的example1.c代码:
    gcc example1.c -lm -lfreetype
运行freetype的example1.c代码对应的程序
    ./a.out msyh.ttf A
 
查看某个文件夹是什么文件系统:
    1、df -T
    2、mount
    
用正确大小的开机图片,将图片制作成.ppm文件。
    转换BMP图片:注-这种转换出来的图片有点问题
        $bmptoppm K1.bmp > 1.ppm //生成ppm
        $ppmquant 224 1.ppm >2.ppm //转换成224颜色
        $pnmnoraw 2.ppm > logo_linux_clut224.ppm //转换成ascii格式    
        
    转换png图片:注-K1通过这种方式是OK的
        pngtopnm K15_24.png > a.pnm
        pnmquant 224 a.pnm > b.pnm
        pnmtoplainpnm b.pnm > logo_linux_clut224.ppm
    
arm查看分辨率和刷新率:    注:刷新频率受时钟频率影响
cat /sys/class/graphics/fb0/modes
    
ssh使用top命令失败:
    export TERM=linux
    
调试QT程序的时候,进程mmcqd/3一直运行,导致QT加载程序内容很慢,可以尝试屏蔽掉/etc/rc.local里面如下内容:
    echo 30000 >  /proc/sys/vm/min_free_kbytes        //这一行设置了最小内存,当空闲内存小于这里设置的内存时,CPU就会置换内存里面的内容
                                                    //min_free_kbytes文件表示强制Linux VM最低保留多少空闲内存(Kbytes)
 
HDMI的热插拔检测:
    1、通过HDMI对应的中断可以来判断HDMI是否插入:cat /proc/irq/147/spurious        奇数插入,偶数拔出
    2、读取edid的值。如果没有插入过,那么edid全为0             //这种只能判断第一次 edid是每个HDMI带有的信息
    3、cat /sys/bus/platform/devices/20e0000.hdmi_video/cable_state        //拔出-plugout  插入-plugin
 
反编译dtb文件:
    ./scripts/dtc/dtc -I dtb -O dts am335x-evm2.dtb -o mytest.dts
    dtc在内核目录的:./scripts/dtc/ 路径
 
secureCRT设置日志时间:
    %M:%D:%h:%m:%s:%t        //月日时分秒毫秒
    
shell多行注释:
#!/bin/sh
ls
ls
:<<!
ls
ls
!    
 
IMX OTG驱动挂载命令:
insmod g_mass_storage.ko file=/dev/mmcblk2p3 stall=0 removable=1
insmod g_mass_storage.ko file=USB stall=0 removable=1
insmod g_mass_storage.ko file=/usbfile stall=0 removable=1    //指定哪一个分区作为OTG对应的磁盘空间
OTG功能流程说明:
    K1板安装对应的OTG驱动时,指定对应的磁盘空间。然后可以向对应的磁盘空间里面写数据。写完之后需要同步 sync
    大主机的USB口连接上K1的OTG时,会将其识别为一个U盘。通过mount挂载命令挂载该U盘。然后可以读取里面相关的内容。
    注:1、同步数据时,K1应该先执行sync命令。这样才能确保数据保存到磁盘上面了。
        2、大主机读数据时,只能读取到K1 执行sync命令之前的数据。如果K1更新了数据,大主机需要重新挂载才能读取到新的数据。
 
控制网络相关命令:
    关闭网络自协商命令:ethtool -A eth0 autoneg off
    开启网络自协商命令:ethtool -A eth0 autoneg on
 
 
Linux查看程序运行的时间:
    ps -p PID -o lstart        //PID是进程的PID号    这条命令是查看程序是什么时候启动的
    date                    //获取当前的时间    通过当前时间和程序驱动的时间,可以计算程序运行的时间
 
Linux查看系统运行的时间:
    方式一:top命令,查看up后面跟的数值。如top - 00:46:36 up 1 day, 18:42,  1 user,  load average: 1.50, 0.83, 0.61        表示系统运行1天+18小时+42分钟
    方式二:cat /proc/uptime    //改命令输出两个数值,如:153779.61 258457.82    第一个数值就是系统运行的时间。
    方式三:ps -p 1 -o lstart    //这里是查看init进程运行了多久。系统起来后,第一个启动的就是init进程。因此该进程运行的时间约等于系统运行的时间
    方式四:w                    //查看系统运行的时间 13:40:55 up 76 days, 19:49, 16 users,  load average: 1.41, 1.10, 0.98
    
屏幕调试先决条件:
1、硬件上是否兼容
 
 
ubuntu上使用valgrind,打开终端,进入可执行程序路径,执行以下命令:
export LIBGL_ALWAYS_SOFTWARE=1
CM_LD_LIBRARY="$PWD/../ExternalLibs/lib/linux/fsl/$DEBUG_AND_RELEASE/"
export LD_LIBRARY_PATH="$PWD":"$PWD/libs":$CM_LD_LIBRARY:$LD_LIBRARY_PATH
valgrind --leak-check=full ./KMonitor
系统退出时,就会打印在系统退出时还没有释放的内存    
 
 
复制当前文件夹的前250个文件到/usr/lib目录里面:
ls | head -n 100 | xargs -i cp -drf {} /usr/lib    
ls | head -n 500 | xargs -i cp -drf {} /usr/lib    
 
复制当前文件夹的后250个文件到/usr/lib目录里面:
ls | tail -n 250 | xargs -i cp -drf {} /usr/lib    
 
 
ls | head -n 100 | xargs -i mv {} /usr/lib    
 
I2C调试工具:
1、 i2cdetect    
    i2cdetect -l//检测有几组I2C总线在系统上
    i2cdetect -r -y 1    //检测I2C-1上面的挂载情况
2、 i2cdump
    i2cdump -f -y 1 0x20    //查看I2C-1总线上面 0x20设备的所有寄存器的值
3、 i2cget
    i2cget -f -y 1 0x20 0x77    //查看I2C-1总线上面,0x20设备的0x77寄存器的值
    i2cget -f -y 2 0x2a 0x00
4、 i2cset
    i2cset -f -y 1 0x20 0x77 0x3f    //设置I2C-1总线上面,0x20设备的0x77寄存器的值为0x3f
    i2cset -f -y 0 0x08 0x1a 0x0f
 
Linux使用命令设置串口波特率
    stty -F /dev/ttymxc2 ispeed 115200 ospeed 115200 cs8  
    stty -F /dev/ttymxc2 ispeed 230400 ospeed 230400 cs8  
    //ispeed 设置输入波特率:115200
    //ospeed 设置输出波特率:115200
    //cs8 设置字符大小为8    csN:N表示字符大小(5-8)

Linux更新分区表命令:
    blockdev --rereadpt -v /dev/sdb            //这个在820A平台上面实测可行
    hdparm -z /dev/sdb
    partprobe /dev/sdb
 
查看程序打开的文件信息,可以执行如下命令:
ls -l /proc/277/fd            //注:这里的277是进程ID号    
    
设置根文件系统为只读模式:
    修改/etc/init.d/checkroot.sh文件里面 rootmode的值,设置为 rootmode=ro
 
对磁盘进行格式化时:指定inode的数量
    mkfs.ext3 /dev/sda1 -N 18276352            //指定inode的数量为 18276352    
     mkfs.vfat -F 32 /dev/mmcblk2p1            //指定格式化成fat32格式,这样是为了解决大容量存储时的报错
 
IVD-IMX6:背光控制
    /sys/devices/soc0/backlight.31/backlight/backlight.31/brightness    背光控制文件
      
windows连接远程桌面:
    win+r    然后输入:mstsc
 
dos操作命令:
    查看文件内容:type filename
ubuntu中adb shell出现insufficient permissions for device问题:
    解决办法
        第一步:cd /etc/udev/rules.d/
        第二步:sudo touch 51-android.rules
        第三步:在上一步创建的文件中加入以下内容SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"


adb上传下载文件:
adb push命令 :从电脑上传送文件到手机
    adb push D:\share\file.txt /data            //拷贝D盘share目录下面的file.txt文件到板卡的/data目录下面
    adb push D:\share\boot.img /
    adb push D:\share\lqd_abctl /
    adb push D:\share\libais_mx9286.so /
    adb push D:\share\zros.tar.gz /

查看设备列表:adb devices
选中设备:adb -s 设备号                         //adb -s 9da9101a shell
adb 提示:error: device offline
    解决办法:    adb kill-server                    //一般只执行这个命令就行
                
                
                adb remount
mount -o remount,rw /

adb pull命令 :从手机传送文件到电脑上
    adb pull /data/file.txt D:\share            //拷贝板卡/data目录下面的file.txt文件到电脑的D盘下面share目录

fastboot更新程序:
    fastboot flash aboot D:\share\emmc_appsboot.mbn    //将D盘share目录下面的emmc_appsboot.mbn更新到flash上面去
    fastboot flash aboot D:\share\emmc_appsboot.mbn
    fastboot --set_active=a                            //设置分区A为活动分区

bitbake:
    bitbake -c cleanall libabctl                //清空 libabctl 上一次的编译记录

vscode相关操作:
    1、查找函数 ctrl+shift+o        //或者ctrl+p,然后在搜索框里面输入@
    2、查找文件 ctrl+p
    3、格式化代码 shift+alt+f

 
//================================================================    
Linux获取扇区大小:
root@imx6qsabresd:/# fdisk -l
 
Disk /dev/mmcblk3: 7.1 GiB, 7650410496 bytes, 14942208 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes                //扇区大小512Byte
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
 
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk3p1       51200   665599   614400  300M 83 Linux
/dev/mmcblk3p2      665600   686079    20480   10M 83 Linux
/dev/mmcblk3p3      686080   706559    20480   10M 83 Linux
/dev/mmcblk3p4      706560 14942207 14235648  6.8G 83 Linux
 
Disk /dev/mmcblk3boot1: 2 MiB, 2097152 bytes, 4096 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mmcblk3boot0: 2 MiB, 2097152 bytes, 4096 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@imx6qsabresd:/#  
//================================================================    
 
 
 
//================================================================    
Linux获取块大小:
方法一:
root@imx6qsabresd:/# blockdev --getbsz /dev/mmcblk3p3  
4096                                                                    //块大小4096
root@imx6qsabresd:/#  
 
方法二:
root@imx6qsabresd:/# stat -f /dev/mmcblk3p3  
  File: "/dev/mmcblk3p3"
    ID: 0        Namelen: 255     Type: tmpfs
Block size: 4096       Fundamental block size: 4096                        //块大小4096
Blocks: Total: 92754      Free: 92754      Available: 92754
Inodes: Total: 92754      Free: 92403
root@imx6qsabresd:/#  
 
方法三:
liuqidong@ubtby-35:~/lqd/program_self/c/ext3$ sudo tune2fs -l /dev/sdb1  
[sudo] liuqidong 的密码:  
tune2fs 1.42.13 (17-May-2015)
Filesystem volume name:   <none>
Last mounted on:          /addDisk
Filesystem UUID:          6fa3711a-d337-4630-b9e1-f0fd1bdd2faf
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash  
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3276800
Block count:              13106944
Reserved block count:     655347
Free blocks:              2362878
Free inodes:              3046664
First block:              0
Block size:               4096                                        //块大小4096
Fragment size:            4096
Reserved GDT blocks:      1020
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Thu Sep 12 17:35:29 2019
Last mount time:          Thu Mar  4 22:47:15 2021
Last write time:          Thu Mar  4 22:47:15 2021
Mount count:              27
Maximum mount count:      -1
Last checked:             Thu Sep 12 17:35:29 2019
Check interval:           0 (<none>)
Lifetime writes:          2082 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      c74eb384-136f-4b04-9315-898548ca661a
Journal backup:           inode blocks
liuqidong@ubtby-35:~/lqd/program_self/c/ext3$  


//================================================================    
 
comen共享网络磁盘:\\comennasen
//================================================================    
/*附件1:添加swap分区*/    
一、新建磁盘分区作为swap分区//这种方式没有亲测
1. # swapoff -a #停止所有的swap分区
2. 用fdisk命令(例:# fdisk /dev/sdb)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。
3. # mkswap /dev/sdb2 #格式化swap分区,这里的sdb2要看您加完后p命令显示的实际分区设备名
4. # swapon /dev/sdb2 #启动新的swap分区
5. 为了让系统启动时能自动启用这个交换分区,可以编辑/etc/fstab,加入下面一行
/dev/sdb2 swap swap defaults 0 0    
 
二、用文件作为Swap分区//这种方式1-3步已经测试OK,第4步没有测试
1.创建要作为swap分区的文件:增加10GB大小的交换分区(原理的swap分区不变),则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
# dd if=/dev/zero of=/root/swapfile bs=1M count=10240
2.格式化为交换分区文件:
# mkswap /root/swapfile    #建立swap的文件系统
3.启用交换分区文件:
# swapon /root/swapfile     #启用swap文件
4.使系统开机时自启用,在文件/etc/fstab中添加一行:
/root/swapfile swap swap defaults 0 0
//================================================================    
    
    
//================================================================    
/*附件2:屏幕行场频对应关系*/
3.     u32 refresh;        60    /* 刷新频率 */   
4.     u32 xres;           1024  //行像素   
5.     u32 yres;           768   //列像素   
6.     u32 pixclock;       19528(14065) //时钟频率,单位ps,14430   
7.     u32 left_margin;    140   // HBPD(horizontal back porch):80   
8.     u32 right_margin;   160   // HFPD(horizontal front porth):48   
9.     u32 upper_margin;   20    // VBPD(vertical back porch),15   
10.    u32 lower_margin;   12    // VFBD(vertical front porch),2   
11.    u32 hsync_len;      20    // HSPW(horizontal sync pulse width):32   
12.    u32 vsync_len;      3     // VSPW(vertical sync pulse width):47  
//================================================================    
 
//================================================================    
/*附件3:计算pixclock像素时钟和帧率*/
 
dotclock是视频硬件在显示器上绘制像素的速率。
dotclock为 27MHz. 所以
pixclock = 1 / (27E6) = 3.7037037037037036e-08, 取整为37037 皮秒
帧率的计算:
帧率=dotclock / ((xres+left_margin+right_margin+hsync)*(yres+upper_margin+low_margin+vsync))
=  (27E6)/( (40 + 800 + 60 + 20) (10 + 480 + 10 + 10))
= 57.54475703324808, 取整为 57Hz。
xres和yres已经由硬件固定,一般屏幕的刷新率一般为60Hz,而高于刷新率的帧数都是无效帧数。所以可以根据公式调整其他参数以调整LCD帧率,使其尽量接近60fps. 如果数值设置偏差的话,可能会造成屏幕沙点,抖动现象。
//================================================================

本文标签: note