15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

归档标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

月度归档 1月 15, 2020

[f1c100s/f1c200s]spi-flash系统制作

spi-flash系统生成需要进行四部曲: “uboot” 、 “dtb” 、“kernel” 和 “rootfs” 。以16M flash举例, 介绍 spi flash 的适配过程。 分区表如下:

分区序号 分区大小 分区作用 地址空间及分区名
mtd0 1MB (0x100000) spl+uboot 0x0000000-0x0100000 : “uboot”
mtd1 64KB (0x10000) dtb文件 0x0100000-0x0110000 : “dtb”
mtd2 4MB (0x400000) linux内核 0x0110000-0x0510000 : “kernel”
mtd3 剩余 (0xAF0000) 根文件系统 0x0510000-0x1000000 : “rootfs”

一、安装交叉编译环境

# 此处为获取7.2.1版本,您可获取其他版本或者通过链接直接下载
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz

tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/

sudo vim /etc/bash.bashrc

# 在文件末尾 添加以下内容
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
# 添加完毕

# 使路径生效
source /etc/bash.bashrc

此时可用 arm-linux-gnueabi-gcc -v 进行测试;若普通用户状态下没有成功,通过 sudo su 切换到root用户再尝试;

二、uboot配置及编译

1、从GitHub下载uboot源码

sudo apt-get install git
git clone https://github.com/Lichee-Pi/u-boot.git
cd u-boot

# 查看分支
git branch -a
# 切换到 Nano 分支
git checkout nano-v2018.01

2、uboot源码结构

.
├── api             //封装一些平台无关的操作,如字符串打印,显示,网络,内存
├── arch            //以平台架构区分
│   ├──arm
│   │   └──cpu
│   │   │   └──arm926ejs
│   │   │   │   └──sunxi   //cpu相关的一些操作,如定时器读取
│   │   │   │   │   └──u-boot-spl.lds  //spl的放置方法
│   │   └──dts
│   │   │   └──suniv-f1c100s-licheepi-nano.dts   // f1c100s芯片的一些配置
│   │   │   └──suniv-f1c100s-licheepi-nano.dtb
│   │   │   └──suniv-f1c100s.dtsi
│   │   │   └──suniv.dtsi
│   │   └──lib      //一些库文件
│   │   └──mach-sunxi
│   │   │   └──board.c          //board_init_f
│   │   │   └──dram_sun4i.c     //ddr的操作,复位,时钟,延时,odt,etc.
│   │   │   └──dram_helpers.c   //ddr的设置及读写测试
├── board
│   ├──sunxi
│   │   └──board.c              //sunxi_board_init 入口
│   │   └──dram_suniv.c        //DRAM的一些默认参数
├── cmd             //Uboot命令行的一些命令
├── common          //含spl
├── configs         //menuconfig里的默认配置,比如各类驱动适配
│   ├── licheepi_nano_defconfig
│   ├── licheepi_nano_spiflash_defconfig
├── disk            //硬盘分区的驱动
├── doc
├── drivers         //外设驱动
├── dts
├── examples
├── fs              //多种文件系统
├── include
│   ├──configs
│   │   └──sunxi_common.h   //预配置的参数,如串口号等
│   │   └──suniv.h
├── lib             //加密压缩等算法
├── net             //nfs,tftp等网络协议
├── post
├── scripts

3、uboot配置

# 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各项默认配置为 nano 的spiflash支持版
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig

# 若不带spi-flash的板子,请换成 licheepi_nano_defconfig

修改文件uboot源码目录下 进入 ./include/configs/suniv.h
#define CONFIG_BOOTCOMMAND   "sf probe 0:50000000; "                 \
                             "sf read 0x80C00000 0x100000 0x4000; "  \
                             "sf read 0x80008000 0x110000 0x400000; " \
                             "bootz 0x80008000 - 0x80C00000"

# 进行可视化配置
make ARCH=arm menuconfig

#取消勾选 [ ] Enable a default value for bootcmd
#勾选 [*] Enable boot arguments;
#在下方一项中填入 bootargs 参数:
console=ttyS0,115200 panic=5 rootwait root=/dev/mtdblock3 rw rootfstype=jffs2
#(root=/dev/mtdblock3 指的是mtd设备第三分区,分区指定在dts中声明)

4、添加LCD支持

ARM architecture ‣ Enable graphical uboot console on HDMI, LCD or VGA 为 Y
#接着配置同级的 LCD panel timing details 为:
#分辨率800*480
x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0
#分辨率480*272
x:480,y:272,depth:18,pclk_khz:10000,le:42,ri:8,up:11,lo:4,hs:1,vs:1,sync:3,vmode:0
并将 LCD panel backlight pwm pin 设为:PE6 (管脚参照原理图)

5、uboot编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4

编译完成后,可一看到目录下多了一堆以u-boot带头的文件,我们只需取 u-boot-sunxi-with-spl.bin 即可。

三、Linux配置及编译

1、从GitHub下载Linux源码

#下载代码
git clone --depth=1 -b f1c100s-480272lcd-test https://github.com/Icenowy/linux.git

下载配置文件:

下载 .config 文件,放入源码主目录进行替换 (若下载时文件名有变,请重命名回 .config );

2、DTS修改

修改内核源码目录下的 ./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts

&spi0 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi0_pins_a>;
    status = "okay";
    spi-max-frequency = <50000000>;
    flash: w25q128@0 {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "winbond,w25q128", "jedec,spi-nor";
        reg = <0>;
        spi-max-frequency = <50000000>;
        partitions {
            compatible = "fixed-partitions";
            #address-cells = <1>;
            #size-cells = <1>;

            partition@0 {
                label = "u-boot";
                reg = <0x000000 0x100000>;
                read-only;
            };

            partition@100000 {
                label = "dtb";
                reg = <0x100000 0x10000>;
                read-only;
            };

            partition@110000 {
                label = "kernel";
                reg = <0x110000 0x400000>;
                read-only;
            };

            partition@510000 {
                label = "rootfs";
                reg = <0x510000 0xAF0000>;
            };
        };
    };
};

此处在dts中为mtd设备预先划分好了分区内容,内核将会自动解析 。

3、内核配置修改

#打开可视化配置窗口
make ARCH=arm menuconfig

勾选 File systems ‣ Miscellaneous filesystems ‣ Journalling Flash File System v2 (JFFS2) support 。

勾选 Device Drivers -> Memory Technology Device (MTD) support ,及下面子项:

  • Caching block device access to MTD devices  #为了生成/dev/mtdblock*设备,不选会报错

勾选 Device Drivers -> SPI support ,及下面子项:

Allwinner A31 SPI Controller  (勾选)
Allwinner A10 SoCs SPI controller   (不勾选)

修改源码下的 ./drivers/mtd/ spi-nor/ spi-nor.c

修改对应spi-flash;如 w25q128 :

{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
// 修改为 (不使用sector,使用块擦除):
{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, 0) },

4、内核编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4    #请自行修改编译线程数

生成的 zImage 在 arch ‣ arm ‣ boot 目录下

编译工具链为 arm-linux-gnueabi,工具链的安装请参考 uboot 编译部分 。

四、DTB文件编译

进入Linux目录,执行如下代码:

设备树在源码的 linux ‣ arch ‣ arm ‣ boot ‣ dts ‣ suniv-f1c100s-licheepi-nano.dts;

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j4

生成的 dtb文件 在 dts同级目录下 。

五、根文件系统编译

1、下载依赖包

apt-get install linux-headers-$(uname -r)

2、buildroot下载配置

wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
make menuconfig
Target options  --->

    Target Architecture Variant (arm926t)  --->   // arm926ejs架构
[ ] Enable VFP extension support                  // Nano 没有 VFP单元,勾选会导致某些应用无法运行
    Target ABI (EABI)  --->
    Floating point strategy (Soft float)  --->    // 软浮点

System configuration  --->

    (Lichee Pi) System hostname                   // hostname
    (licheepi) Root password                      // 默认账户为root 密码为licheepi
    [*] remount root filesystem read-write during boot  // 启动时重新挂在文件系统使其可读写

3、编译

若编译时,buildroot下载软件包速度太慢,请下载 dl.zip ,将其中的软件包解压至 buildroot ‣ dl 下;

#编译命令:
make

编译完成的镜像包,是在 buildroot-2017.08 ‣ output ‣images ‣ rootfs.tar 中找到 。

六、一键打包生成SPIflash固件脚本

脚本下载:

把.txt改成.sh。

[Linux]Linux 下Shell变量,环境变量的联系与区别

  1. 简介

linux下的变量可分成两种:Shell变量和环境变量。

Shell变量,又称本地变量,包括私有变量以及用户变量,不同类的shell有不同的私有变量,bash,ksh,csh等,每种shell的私有变量都不一样

环境变量,又称用户变量,与shell无关

常规定义变量的方法:变量名=变量值

注意:

1.变量名和=号之间不能有空格,否则shell会把变量名当成命令

2.变量名称一般使用大写字母

  • 常用的相关命令

env命令:显示当前用户的环境变量

set命令:不加参数,显示当前shell的所有本地设置的Shell变量,否则设置shell变量

unset命令:unset为shell内建指令,删除变量或函数。

exprot命令:显示(设置)当前导出成用户变量的shell变量(注意:export为bash或类bash私有的命令)

echo $变量名:查看变量值(其中,$变量:引用变量的意思)

  • 示例
  • 使用env命令显示当前用户的所有环境变量

[laiyu@localhost ~]$ env

HOSTNAME=localhost.localdomain

SHELL=/bin/bash

TERM=xterm

HISTSIZE=1000

USER=laiyu

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;…

MAIL=/var/spool/mail/laiyu

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/laiyu/bin

PWD=/home/laiyu

LANG=en_US.UTF-8

HOME=/home/laiyu

LOGNAME=laiyu

_=/bin/env

  • 使用set命令显示当前shell所有本地Shell变量

[root@localhost ~]# set | more

BASH=/bin/bash

BASH_CMDS=()

  • 使用unset命令来清除变量(不管是shell变量还是环境变量)

[laiyu@localhost ~]$ export TEST=test #增加一个环境变量TEST

[laiyu@localhost ~]$ env | grep TEST  #查看增加的变量

TEST=test

[laiyu@localhost ~]$ unset $TEST #删除环境变量TEST(这里TEST前有无美元符都一样)

[laiyu@localhost ~]$ env | grep TEST #输出为空

注意:unset只能删除非只读变量

  • 使用echo命令显示环境变量(HOME变量为例)

[root@localhost ~]# echo $HOME

/root

  • 使用export命令将shell变量导出为用户变量,并显示

列出所有的Shell赋予程序的环境变量

[root@localhost ~]# export -p #等同export

declare -x HOME=”/root”

declare -x HOSTNAME=”localhost.localdomain”

declare -x LANG=”en_US.UTF-8″

declare -x LESSOPEN=”|/usr/bin/lesspipe.sh %s”

declare -x LOGNAME=”root”

declare -x PATH=”/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/:/usr/local/tsung/bin”

shell变量导出为用户变量

[root@localhost ~]# SHOUKE=ishouke  #定义shell变量

[root@localhost ~]# echo $SHOUKE 

ishouke

#查看当前用户的用户变量是否存在SHOUKE变量,结果是不存在

[root@localhost ~]# env | grep SHOUKE

#查看当前shell的本地变量是否存在SHOUKE变量,结果是不存在

[root@localhost ~]# set | grep SHOUKE

SHOUKE=ishouke

#查看Shell赋予程序的环境变量中是否存在SHOUKE变量,结果不存在

[root@localhost ~]# export | grep SHOUKE

#导出shell变量为用户变量

[root@localhost ~]# export SHOUKE

[root@localhost ~]# env | grep SHOUKE

SHOUKE=ishouke

[root@localhost ~]#

————————————–

也可以如下方式使用export

[root@localhost ~]# export SHOUKE=ishouke

[root@localhost ~]# env | grep SHOUKE

SHOUKE=ishouke

[root@localhost ~]#

注意:以上的设置仅在当前打开的shell窗口或或其子shell窗口中起作用,临时的,关闭当前shell窗口或重启机器,则刚才的设置失效,,或打开一个新窗口,设置在新窗口中不起作用。

[Linux]dd命令详解

d 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
名称: dd
使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file
使用方式:
dd [option]
如果你想要在线看 manual, 可以试试:

dd –help

或是

info dd

如果你想要看看这个版本如何:

dd –version

输入或输出

dd if=[STDIN] of=[STDOUT]

强迫输入或输出的Size为多少Bytes

bs: dd -ibs=[BYTE] -obs=[SIZE]

强迫一次只做多少个 Bytes

cbs=BYTES

跳过一段以后才输出

seek=BLOCKS

跳过一段以后才输入

skip=BLOCKS
  • 语法:dd [选项]
  • if =输入文件(或设备名称)。
  • of =输出文件(或设备名称)。
  • ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。
  • skip = blocks 跳过读入缓冲区开头的ibs*blocks块。
  • obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。
  • bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。
  • cbs = byte 一次转换bytes字节。
  • count=blocks 只拷贝输入的blocks块。
  • conv = ASCII 把EBCDIC码转换为ASCIl码。
  • conv = ebcdic 把ASCIl码转换为EBCDIC码。
  • conv = ibm 把ASCIl码转换为alternate EBCDIC码。
  • conv = block 把变动位转换成固定字符。
  • conv = ublock 把固定位转换成变动位。
  • conv = ucase 把字母由小写转换为大写。
  • conv = lcase 把字母由大写转换为小写。
  • conv = notrunc 不截短输出文件。
  • conv = swab 交换每一对输入字节。
  • conv = noerror 出错时不停止处理。
  • conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。

例1:要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:

$ dd if =/dev/fd0 of = /tmp/tmpfile

拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:

$ dd if = /tmp/tmpfile of =/dev/fd0

软盘拷贝完成后,应该将临时文件删除:

$ rm /tmp/tmpfile

例2:把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。
(注意:软盘中的内容会被完全覆盖掉)

$ dd if = net.i of = /dev/fd0 bs = 16384

例3:将文件sfile拷贝到文件 dfile中。

$ dd if=sfile of=dfile

例4:创建一个100M的空文件

dd if=/dev/zero of=hello.txt bs=100M count=1
  • ============================================
  • /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
  • /dev/zero,是一个输入设备,你可你用它来初始化文件。
  • /dev/null——它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
  • /dev/zero——该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
$ dd if=/dev/zero of=./test.txt bs=1k count=1
$ ls -l
total 4
-rw-r–r– 1 oracle dba 1024 Jul 15 16:56 test.txt

eg:

$ find / -name access_log 2>/dev/null

创建特定大小文件最简单的方法是使用 dd 命令。

dd if=“inputFileName” of=”outFileName” bs=”块大小” count=“块个数”

块大小可以使用各种计量单位
字节(1B) – c 字(2B) – w
块(512B) – b 千字节(1024B) – k
兆字节(1024K) – M 吉字节(1024M) – G

例:

dd if=/dev/zero of=test.file bs=1M count=10

在当前文件夹下创建一个大小为10M的文件test.file 内容全为0
/dev/zero 是一个字符设备,它会不断返回0值字节(/0).
如果不指定输入参数(if),默认情况会从stdin读取输入。如果不指定输出参数(of),默认情况会将stdout作为输出。
也可用 dd 命令来传输大量数据来测试内存的操作速度。

$ dd if=/dev/zero of=./testmm.file bs=10M count=10

记录了10+0 的读入
记录了10+0 的写出
104857600字节(105 MB)已复制,0.577581 秒,182 MB/秒

$ ll -h |grep ‘testmm.file’
-rw-rw-r–. 1 itudu itudu 100M 7月 16 18:14 testmm.file

文件类型:
一般文件: –
目录文件: d
字符设备: c
块设备: b
链接文件: l
套接字文件: s
管道文件: p

目录的读、写、执行权限意义:
读权限:允许读取目录中文件和子目录的列表
写权限:允许在目录中新建和删除文件或子目录
执行权限:可以访问目录中的文件和子目录