荔枝派zero从焊接到跑起linux

步骤

焊flash芯片(如果大于16M,需要改烧录工具的源码)
焊引脚,为了串口看数据

焊接flash芯片,需要注意1号脚的位置,flash芯片在开发板背面,1号脚位置是靠近麦克风的那边

以下为编译相关步骤,参考连接,注意,下载的源码,选用spi flash模式

uboot

git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
Architecture select,选ARM
Device Drivers
    SPI Flash Support
    勾选自己flash的厂家名称,这里选Macronix SPI flash support
    如果使用的是16MB以上的flash,需要勾选flash bank支持选项,否则最多只能读到16MB
code include/configs/sun8i.h,在include xxx之前添加
#define CONFIG_BOOTCOMMAND   "sf probe 0; "                                                        "sf read 0x41800000 0x100000 0x10000; "                               "sf read 0x41000000 0x110000 0x400000; "                              "bootz 0x41000000 - 0x41800000"

 #define CONFIG_BOOTARGS      "console=ttyS0,115200 earlyprintk panic=5 rootwait "                              "mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"

编译

time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log

下载linux内核源码

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- licheepi_zero_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

选中

Device Drivers
    <*>Memory Technology Device (MTD) support
        <*> Command line partition table parsing 该项目用来解析uboot传递过来的flash分区信息。
        <*> SPI-NOR device Support
File systems
    <*> Miscellaneous filesystems
        <*> Journalling Flash File System v2 (JFFS2) support
code arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts
&spi0 {
        status ="okay";

        mx25l25635e:[email protected]0 {
                compatible = "jedec,spi-nor";
                reg = <0x0>;
                spi-max-frequency = <50000000>;
                #address-cells = <1>;
                #size-cells = <1>;
        };

};

编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
东西在在 arch/arm/boot/zImage

rootfs,以前弄过,直接用mkfs.jffs2生成文件系统了

sudo mkfs.jffs2 -s 0x100 -e 0x10000 -p 0x1AF0000 -d ~/downloads/rootfs/ -o ../jffs2.img

打包镜像

dd if=/dev/zero of=flashimg.bin bs=1M count=32
dd if=$HOME/dev/embedded/lichee/zero/SPI_Flash/u-boot/u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc
dd if=$HOME/dev/embedded/lichee/zero/SPI_Flash/linux-zero-4.13.y/arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb of=flashimg.bin bs=1K seek=1024  conv=notrunc
dd if=$HOME/dev/embedded/lichee/zero/SPI_Flash/linux-zero-4.13.y/arch/arm/boot/zImage of=flashimg.bin bs=1K seek=1088  conv=notrunc
dd if=$HOME/dev/embedded/lichee/zero/SPI_Flash/jffs2.img of=flashimg.bin  bs=1K seek=5184  conv=notrunc

烧录固件

git clone -b spi-rebase https://github.com/Icenowy/sunxi-tools.git

修复超过16M的写入问题

code fel-spiflash.c,搜索

#define CMD_WRITE_ENABLE 0x06
和
aw_fel_spiflash_write_helper函数

改成如下部分

#define CMD_WRITE_ENABLE 0x06 部分,改成如下
#define CMD_WRITE_ENABLE 0x06
#define SPI_FLASH_16MB_BOUN  0x1000000
# define CMD_BANKADDR_BRWR              0x17    //only SPANSION flash use it
# define CMD_BANKADDR_BRRD              0x16
# define CMD_EXTNADDR_WREAR             0xC5
# define CMD_EXTNADDR_RDEAR             0xC8
size_t bank_curr = 0;

void aw_fel_spiflash_write_helper(feldev_handle *dev,
                  uint32_t offset, void *buf, size_t len,
                  size_t erase_size, uint8_t erase_cmd,
                  size_t program_size, uint8_t program_cmd)
{
    uint8_t *buf8 = (uint8_t *)buf;
    size_t max_chunk_size = dev->soc_info->scratch_addr - dev->soc_info->spl_addr;
    size_t cmd_idx, bank_sel;

    if (max_chunk_size > 0x1000)
        max_chunk_size = 0x1000;
    uint8_t *cmdbuf = malloc(max_chunk_size);
    cmd_idx = 0;

    prepare_spi_batch_data_transfer(dev, dev->soc_info->spl_addr);
    //add bank support
    {
    cmd_idx = 0;
    bank_sel = offset /SPI_FLASH_16MB_BOUN;
    if (bank_sel == bank_curr)
        goto bar_end;

    /* Emit write enable command */
    cmdbuf[cmd_idx++] = 0;
    cmdbuf[cmd_idx++] = 1;
    cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
    /* Emit write bank */
    cmdbuf[cmd_idx++] = 0;
    cmdbuf[cmd_idx++] = 2;
    cmdbuf[cmd_idx++] = CMD_EXTNADDR_WREAR;
    cmdbuf[cmd_idx++] = offset >> 24;
    /* Emit wait for completion */
    cmdbuf[cmd_idx++] = 0xFF;
    cmdbuf[cmd_idx++] = 0xFF;
    /* Emit the end marker */
    cmdbuf[cmd_idx++] = 0;
    cmdbuf[cmd_idx++] = 0;
    aw_fel_write(dev, cmdbuf, dev->soc_info->spl_addr, cmd_idx);
    aw_fel_remotefunc_execute(dev, NULL);
    bar_end:
        bank_curr = bank_sel;
    }

    cmd_idx = 0;

    while (len > 0) {
        while (len > 0 && max_chunk_size - cmd_idx > program_size + 64) {
            if (offset % erase_size == 0) {
                /* Emit write enable command */
                cmdbuf[cmd_idx++] = 0;
                cmdbuf[cmd_idx++] = 1;
                cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
                /* Emit erase command */
                cmdbuf[cmd_idx++] = 0;
                cmdbuf[cmd_idx++] = 4;
                cmdbuf[cmd_idx++] = erase_cmd;
                cmdbuf[cmd_idx++] = offset >> 16;
                cmdbuf[cmd_idx++] = offset >> 8;
                cmdbuf[cmd_idx++] = offset;
                /* Emit wait for completion */
                cmdbuf[cmd_idx++] = 0xFF;
                cmdbuf[cmd_idx++] = 0xFF;
            }
            /* Emit write enable command */
            cmdbuf[cmd_idx++] = 0;
            cmdbuf[cmd_idx++] = 1;
            cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
            /* Emit page program command */
            size_t write_count = program_size;
            if (write_count > len)
                write_count = len;
            cmdbuf[cmd_idx++] = (4 + write_count) >> 8;
            cmdbuf[cmd_idx++] = 4 + write_count;
            cmdbuf[cmd_idx++] = program_cmd;
            cmdbuf[cmd_idx++] = offset >> 16;
            cmdbuf[cmd_idx++] = offset >> 8;
            cmdbuf[cmd_idx++] = offset;
            memcpy(cmdbuf + cmd_idx, buf8, write_count);
            cmd_idx += write_count;
            buf8    += write_count;
            len     -= write_count;
            offset  += write_count;
            /* Emit wait for completion */
            cmdbuf[cmd_idx++] = 0xFF;
            cmdbuf[cmd_idx++] = 0xFF;
        }
        /* Emit the end marker */
        cmdbuf[cmd_idx++] = 0;
        cmdbuf[cmd_idx++] = 0;

        /* Flush */
        aw_fel_write(dev, cmdbuf, dev->soc_info->spl_addr, cmd_idx);
        aw_fel_remotefunc_execute(dev, NULL);
        cmd_idx = 0;
    }

    free(cmdbuf);
}

make

烧录

测试是否发现flash设备
sunxi-fel version
sunxi-fel -p spiflash-write 0 ~/dev/embedded/lichee/zero/SPI_Flash/flashimg.bin

重新上电以后,是不是就看到串口有输出啦

原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/11515978.html

时间: 2024-11-09 02:18:22

荔枝派zero从焊接到跑起linux的相关文章

荔枝派 V3S Linux 应用层 IIC 使用OLED

1.开始 我想在荔枝派上驱动oled屏,但是在内核中写驱动对我来说肯定是非常麻烦的,所以我退而求其次,想在应用层中操作通用i2c接口来实现oled的驱动程序. 我买的OLED是中景园经典款,四针IIC接口oled.首先我参考了NanoPi的Matrix库,参考他的IIC应用层函数.我发现他多include了一个i2c-dev.h 并且这个函数的内容是比我/usr/inlucde/linux/i2c-dev.h中的内容多的,他多了以下几个函数 static inline __s32 i2c_smb

荔枝派Licheepi nano裸机移植ZLG_GUI和3D旋转立方体

一:前言 以前申请到了荔枝派zero,在发了两个开箱贴后就放在一边吃灰了.后来又购买了荔枝派nano,刷了几个教程中的系统之后又放到一边吃灰了.虽然有屯板子的习惯,却没有使用板子的能力. 后来,经过断断续续的摸索和群里面的新手教程,终于搭建好了Licheepi Nano的交叉编译环境,自己GCC了一个hellowworld传输到了开发板并运行了起来.可是......对,于是又继续吃灰. 再后来,在大神 @晕哥 的 填坑网 (https://debugdump.com/index.html)看到了

.NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点

今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现在换成了ASP.NET Core,主要代码如下: var psi = new ProcessStartInfo(command, arguments) { RedirectStandardOutput = true, RedirectStandardInput = true, CreateNoWin

用过Ubuntu,厌倦了Windows,PC已经快乐地跑起Mac OS X

如果你讨厌windows平台,如果你想切换到ubuntu或者其他linux平台,那么有个更好的选择是os x. 我之前也用过ubuntu,对于一个IT技术人员来说,那个系统很棒.但是我还是要处理一些日常的事情,我发现linux desktop真是一团糟,要用的软件很少.很烂.windows比他们强多了.但是,现在我发现os x比windows更强大. 不仅因为它是基于unix,对IT人员更友好(你知道,我们开发的软件都跑在linux系统上:我也要一个Bash一样的命令行),而且因为它是一个免费.

LINUX块设备驱动&lt;12/13/14/15&gt;

第 12章 +---------------------------------------------------+ |                 写一个块设备驱动                   | +---------------------------------------------------+ | 作者:赵磊                                         | | email: [email protected]             

(15)疯狂的程序员----《绝影》

<疯狂的程序员> <疯狂的程序员>1 天已经七分黑了,屋里却还没开灯.这个全身黑衣服的男子突然像想起什么,从包里掏出烟,抽出一只,递给旁边的人:"兄弟,抽烟么?"――那烟是红塔山. 旁边那人连忙一边摆手,一边说:"不,不."语气有点紧张,好像那黑衣服递过来的不是烟,是海洛因. 这个黑衣服的男子,后来的网名叫"绝影".他旁边那个,后来被他们称为"土匪".这件屋子,就是他们大学寝室. 第一天到学校,其实没有

树莓派(raspberry pi) 系统在SD卡上安装Linux

刚刚拿到一只Simon同学出借的树莓派(raspberry pi) ,准备一张4GB的SD卡,准备跑一下Linux. 在Windows 7上用 工具 Win32DiskImager写入img到SD卡上,报错,失败. 好在俺有Linux vmware虚拟机,在虚拟机上搞,执行命令 sudo dd bs=1M if=2012-12-16-wheezy-raspbian.img  of=/dev/sdb tips: 错误:接电启动树莓派,派上只有红色的Power灯亮,HDMI电视机上没有输出. 原因:

debian系统启动卡住,需要等待大约90秒才能进系统的解决办法

今天调试荔枝派,(不得不吐槽,这个板子真丑),废话不多说,装的debian系统,发现启动的时候卡在了[ **] A start job is running for LSB: Raise network interf...38s / no limit)然后谷歌了一下,大概原因是这是debian的一个通病,他会扫描设备,貌似没有彻底的解决办法,只能侧面解决,解决的办法是把无限期时间改成指定的时间,比如改成5秒 vim /lib/systemd/system/networking.service.d

如何成为一名优秀的程序员?

学习 转自:http://icodeit.org/2017/07/tips-for-newbies/ 作为一个从业快10年的程序员,我想给新入行的程序员们一些建议.这些建议是我希望自己可以在毕业的时候就读到的,也希望它们可以帮助你成为一个更好的程序员. 简单归纳一下,总共有7条: 保持健康 编程之外的爱好 持续学习 正确应对犯错 不要囿于角色 展示你的创意 刻意练习手速 下面我来详细说说每一点. 保持健康 三寸气在千般用,一旦无常万事休 首先要说的当然是健康,脱离的这个本钱,一切都无从谈起.久坐