api imx6q linux
2016-08-09 20:49:43 wince_lover 阅读数 5382
1 u-boot的优化
  1 首先去掉无关紧要的串口信息
  2 将CONFIG_BOOTDELAY改为0
  3 去掉一些不用的驱动,例如SPI、USB、HDMI等等
  4 关闭CONFIG_CMD_NET
  5 U-BOOT会重复初始化MMC,修改do_mmc_dev
  
2 KERNEL的优化
  1 首先打开CONFIG_PRINTK_TIME,这样每条printk的语句都会在前面打印一个时间,这样我们就可以很清楚的知道执行到每一条打印信息的时候的时间了。(优化完,正式发布的时候关闭,打印时间本省也会浪费时间的)
  2 在bootargs中增加initcall_debug=1,这样kernel启动后每调用驱动的init函数,都会将消耗的时间打印出来,这样我们可以将消耗时间长的初始化打印出来,进行优化。
  3 去掉不需要的驱动。
  4 将printk的打印级别调高,减少打印的信息。如果我们想看全部的打印信息,可以在系统启动后通过dmesg命令查看所有的打印信息。
  5 对于初始化中一些小于10 毫秒的sleep,由msleep改为mdelay,因为msleep会让出CPU的占用,而6Q是100hz,也就是说最快调度一次也很定要大于10ms,所以用mdelay会更快些。
  6 对于分配一些很大的内存用于DMA,通过dma_alloc_writecombine分配时间会很长,可以在setup_arch函数中通过alloc_bootmem来预留一块内存。
  7 对于初始化中用时比较长,但是不一定马上就需要的操作,可以移到open的时候执行,或者在初始化的时候开启一个工作队列,在工作队列中处理。
  8 在bootargs中增加 rootflags=data=writeback,这样加载rootfs的时间会快些。
3 init进程的优化
  initlog打印信息的时间比较长,可以将不需要的信息注释掉。
  console_init 函数会找有效的控制台串口,这个函数可以改为直接为console_dev赋值为定义的串口。

  init进程会调用/etc/rcS.d目录下Sxxxxx的脚本文件(S开头,然后是数据,之后是名称)。我们可以将不需要的脚本文件直接去掉,这样也可以节约不少时间。


4 驱动的优化

   对于一些不是马上就要用到的驱动,可以编译成KO文件,放在我们的主界面启动后在加载,或者在需要调用的时候在加载。


5 启动脚本的优化

   可以将我们主界面尽可能提前启动,将一些不是很紧急需要的脚本放到后面来启动。

  
2018-01-24 10:35:03 zouli415 阅读数 167
1 u-boot的优化
  1 首先去掉无关紧要的串口信息
  2 将CONFIG_BOOTDELAY改为0
  3 去掉一些不用的驱动,例如SPI、USB、HDMI等等
  4 关闭CONFIG_CMD_NET
  5 U-BOOT会重复初始化MMC,修改do_mmc_dev
  
2 KERNEL的优化
  1 首先打开CONFIG_PRINTK_TIME,这样每条printk的语句都会在前面打印一个时间,这样我们就可以很清楚的知道执行到每一条打印信息的时候的时间了。(优化完,正式发布的时候关闭,打印时间本省也会浪费时间的)
  2 在bootargs中增加initcall_debug=1,这样kernel启动后每调用驱动的init函数,都会将消耗的时间打印出来,这样我们可以将消耗时间长的初始化打印出来,进行优化。
  3 去掉不需要的驱动。
  4 将printk的打印级别调高,减少打印的信息。如果我们想看全部的打印信息,可以在系统启动后通过dmesg命令查看所有的打印信息。
  5 对于初始化中一些小于10 毫秒的sleep,由msleep改为mdelay,因为msleep会让出CPU的占用,而6Q是100hz,也就是说最快调度一次也很定要大于10ms,所以用mdelay会更快些。
  6 对于分配一些很大的内存用于DMA,通过dma_alloc_writecombine分配时间会很长,可以在setup_arch函数中通过alloc_bootmem来预留一块内存。
  7 对于初始化中用时比较长,但是不一定马上就需要的操作,可以移到open的时候执行,或者在初始化的时候开启一个工作队列,在工作队列中处理。
  8 在bootargs中增加 rootflags=data=writeback,这样加载rootfs的时间会快些。
3 init进程的优化
  initlog打印信息的时间比较长,可以将不需要的信息注释掉。
  console_init 函数会找有效的控制台串口,这个函数可以改为直接为console_dev赋值为定义的串口。

  init进程会调用/etc/rcS.d目录下Sxxxxx的脚本文件(S开头,然后是数据,之后是名称)。我们可以将不需要的脚本文件直接去掉,这样也可以节约不少时间。


4 驱动的优化

   对于一些不是马上就要用到的驱动,可以编译成KO文件,放在我们的主界面启动后在加载,或者在需要调用的时候在加载。


5 启动脚本的优化

   可以将我们主界面尽可能提前启动,将一些不是很紧急需要的脚本放到后面来启动。

2019-02-20 19:29:22 lonnox 阅读数 275

imx6q 笔记  环境:Ubuntu 17.10

一、安装编译工具(二选一):
下载地址:http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/arm-linux-gnueabihf/
1、下载编译工具:gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2;下载地址:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
2、命令安装交叉工具链: sudo apt-get install gcc-arm-linux-gnueabi

二、交叉编译sfdisk
1、下载:https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.23.1.tar.bz2
2、解压:tar -xjf util-linux-2.23.1.tar.bz2
3、配置:./configure --host=arm-linux CC=arm-linux-gnueabi-gcc --prefix=/home/lonnox/work/tools/util-linux-2.23.1/_install --without-ncurses
4、编译:make&&make install

三、搭建网络文件系统
1、tar zxvf rootfs.tgz
2、sudo apt-get install nfs-kernel-server portmap
3、sudo vim /etc/exports
   添加:/home/lonnox/work/imx6/nfs_root *(rw,sync,no_root_squash)
4、sudo /etc/init.d/nfs-kernel-server restart
5、测试nfs是否成功:sudo mount -t nfs 127.0.0.1:/home/lonnox/work/imx6/nfs_root /mnt
    如果出错 svc: failed to register lockdv1 RPC service (errno 111).
    添加-o nolock,命令改成:mount -o nolock -t nfs 192.168.1.104:/home/lonnox/work/imx6/nfs_root /mnt
6.网络文件系统的方式启动
setenv bootargs console=ttySAC0,115200 ${displayArgs} root=/dev/nfs rw nfsroot=192.168.1.104:/home/lonnox/work/imx6/nfs_root,v3,tcp ip=192.168.1.106:192.168.1.104:192.168.1.1:255.255.255.0
mmc dev 3;mmc read ${loadaddr} 0x800 0x3000;setenv bootargs ${bootargs};bootm

四、交叉编译mkfs.ext3
1、下载:https://netix.dl.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.44.3/e2fsprogs-1.44.3.tar.gz
2、解压 tar -xzf e2fsprogs-1.44.3.tar.gz
3、./configure --host=arm-linux CC=arm-linux-gnueabi-gcc --prefix=/home/lonnox/work/tools/e2fsprogs-1.44.3/_install
//=============================================================
///vim tmp_build.sh
#! /bin/sh
CC=arm-linux-gnueabi-gcc ./configure --enable-elf-shlibs --host=arm --prefix=/home/lonnox/work/tools/e2fsprogs-1.44.3/_install
//=============================================================
4、编译:make&&make install
5.拷贝
cp -a  bin/* ../../../imx6/nfs_root/usr/bin/
cp -a  sbin/* ../../../imx6/nfs_root/usr/sbin/
cp -a  lib/* ../../../../imx6/nfs_root/lib/
6、查看分区信息cat /proc/partitions

五、编译uboot
1、下载uboot:git clone https://source.codeaurora.org/external/imx/uboot-imx -b u-boot/master
2、修改board/freescale/mx6qarm2/imximage.cfg
/* DCD */    
DATA 4, 0x020e0798, 0x000C0000    
DATA 4, 0x020e0758, 0x00000000    
DATA 4, 0x020e0588, 0x00000030    
DATA 4, 0x020e0594, 0x00000030    
DATA 4, 0x020e056c, 0x00000030    
DATA 4, 0x020e0578, 0x00000030    
DATA 4, 0x020e074c, 0x00000030    
DATA 4, 0x020e057c, 0x00000030    
DATA 4, 0x020e058c, 0x00000000    
DATA 4, 0x020e059c, 0x00000030    
DATA 4, 0x020e05a0, 0x00000030    
DATA 4, 0x020e078c, 0x00000030    
DATA 4, 0x020e0750, 0x00020000    
DATA 4, 0x020e05a8, 0x00000018    
DATA 4, 0x020e05b0, 0x00000018    
DATA 4, 0x020e0524, 0x00000018    
DATA 4, 0x020e051c, 0x00000018    
DATA 4, 0x020e0518, 0x00000018    
DATA 4, 0x020e050c, 0x00000018    
DATA 4, 0x020e05b8, 0x00000018    
DATA 4, 0x020e05c0, 0x00000018    
DATA 4, 0x020e0774, 0x00020000    
DATA 4, 0x020e0784, 0x00000018    
DATA 4, 0x020e0788, 0x00000018    
DATA 4, 0x020e0794, 0x00000018    
DATA 4, 0x020e079c, 0x00000018    
DATA 4, 0x020e07a0, 0x00000018    
DATA 4, 0x020e07a4, 0x00000018    
DATA 4, 0x020e07a8, 0x00000018    
DATA 4, 0x020e0748, 0x00000018    
DATA 4, 0x020e05ac, 0x00000018    
DATA 4, 0x020e05b4, 0x00000018    
DATA 4, 0x020e0528, 0x00000018    
DATA 4, 0x020e0520, 0x00000018    
DATA 4, 0x020e0514, 0x00000018    
DATA 4, 0x020e0510, 0x00000018    
DATA 4, 0x020e05bc, 0x00000018    
DATA 4, 0x020e05c4, 0x00000018    
DATA 4, 0x021b0800, 0xa1390003    
DATA 4, 0x021b080c, 0x001F001F    
DATA 4, 0x021b0810, 0x001F001F    
DATA 4, 0x021b480c, 0x001F001F    
DATA 4, 0x021b4810, 0x001F001F    
DATA 4, 0x021b083c, 0x43180330    
DATA 4, 0x021b0840, 0x03180310    
DATA 4, 0x021b483c, 0x43200330    
DATA 4, 0x021b4840, 0x0320025C    
DATA 4, 0x021b0848, 0x40363838    
DATA 4, 0x021b4848, 0x38362E3C    
DATA 4, 0x021b0850, 0x3E3C4840    
DATA 4, 0x021b4850, 0x44364640    
DATA 4, 0x021b081c, 0x33333333    
DATA 4, 0x021b0820, 0x33333333    
DATA 4, 0x021b0824, 0x33333333    
DATA 4, 0x021b0828, 0x33333333    
DATA 4, 0x021b481c, 0x33333333    
DATA 4, 0x021b4820, 0x33333333    
DATA 4, 0x021b4824, 0x33333333    
DATA 4, 0x021b4828, 0x33333333    
DATA 4, 0x021b08b8, 0x00000800    
DATA 4, 0x021b48b8, 0x00000800    
DATA 4, 0x021b0004, 0x00020036    
DATA 4, 0x021b0008, 0x09444040    
DATA 4, 0x021b000c, 0x8A8F7955    
DATA 4, 0x021b0010, 0xFF328F64    
DATA 4, 0x021b0014, 0x01FF00DB    
DATA 4, 0x021b0018, 0x00001740    
DATA 4, 0x021b001c, 0x00008000    
DATA 4, 0x021b002c, 0x000026D2    
DATA 4, 0x021b0030, 0x008F1023    
DATA 4, 0x021b0040, 0x00000047    
DATA 4, 0x021b0000, 0x841A0000    
DATA 4, 0x021b001c, 0x04088032    
DATA 4, 0x021b001c, 0x00008033    
DATA 4, 0x021b001c, 0x00048031    
DATA 4, 0x021b001c, 0x09408030    
DATA 4, 0x021b001c, 0x04008040    
DATA 4, 0x021b0020, 0x00005800    
DATA 4, 0x021b0818, 0x00011117    
DATA 4, 0x021b4818, 0x00011117    
DATA 4, 0x021b0004, 0x00025576    
DATA 4, 0x021b0404, 0x00011006    
DATA 4, 0x021b001c, 0x00000000     
/* set the default clock gate to save power */    
DATA 4 0x020c4068 0x00C03F3F    
DATA 4 0x020c406c 0x0030FC03    
DATA 4 0x020c4070 0x0FFFC000    
DATA 4 0x020c4074 0x3FF00000    
DATA 4 0x020c4078 0x00FFF300    
DATA 4 0x020c407c 0x0F0000C3    
DATA 4 0x020c4080 0x000003FF     
/* enable AXI cache for VDOA/VPU/IPU */    
DATA 4 0x020e0010 0xF00000CF    
/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */    
DATA 4 0x020e0018 0x007F007F    
DATA 4 0x020e001c 0x007F007F

3、修改board/freescale/mx6qarm2/mx6qarm2.c
//modify:添加uart1的引脚出事化
static void setup_iomux_uart(void)    
{        
    imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));    
}    

iomux_v3_cfg_t const uart1_pads[] = 
{    
    MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),    
    MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),    
};

iomux_v3_cfg_t const usdhc3_pads[] = 
{    
    MX6_PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    MX6_PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),    
    //MX6_PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),//modify:uart1引脚冲突,注释掉该语句
    //MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),//modify:uart1引脚冲突,注释掉该语句
    
    MX6_PAD_NANDF_CS0__GPIO6_IO11  | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
};


网络部分修改:
//modify:添加
vim include/configs/mx6qarm2.h
#define CONFIG_NET_RANDOM_ETHADDR
#define CONFIG_LIB_RAND

//modify:修改引脚
vim mx6qarm2.c
iomux_v3_cfg_t const enet_pads[] = {    
    MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
    MX6_PAD_ENET_RXD1__GPIO1_IO26 | MUX_PAD_CTRL(NO_PAD_CTRL),    
    MX6_PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL),
    MX6_PAD_RGMII_TXC__RGMII_TXC  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD0__RGMII_TD0  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD1__RGMII_TD1  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD2__RGMII_TD2  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TD3__RGMII_TD3  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),        
    MX6_PAD_RGMII_RXC__RGMII_RXC  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD0__RGMII_RD0  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD1__RGMII_RD1  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD2__RGMII_RD2  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RD3__RGMII_RD3  | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),    
    MX6_PAD_ENET_REF_CLK__ENET_TX_CLK  | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

//modify:添加初始化
int board_early_init_f(void)
{
    volatile unsigned int i = 0x88888;
    setup_iomux_uart();
    setup_iomux_enet();
    //reset_ar8035();
    /* Reset AR8031 PHY */
    gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
    while(i--);//mdelay(10);
    gpio_set_value(IMX_GPIO_NR(1, 25), 1);
    //udelay(100);
    return 0;
}

SD卡部分修改:
SD卡挂载在ESDHC2上
int board_mmc_init(bd_t *bis)
{
    int ret;
    u32 index = 0;
 
    usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);//modify:修改为MXC_ESDHC2_CLK
    usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
 
    for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
        switch (index) {
        case 0:
            imx_iomux_v3_setup_multiple_pads(
                usdhc2_pads, ARRAY_SIZE(usdhc2_pads));//modify:修改为 usdhc2_pads
            break;
        case 1:
            imx_iomux_v3_setup_multiple_pads(
                usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
            break;
        default:
            printf("Warning: you configured more USDHC controllers"
                "(%d) then supported by the board (%d)\n",
                index + 1, CONFIG_SYS_FSL_USDHC_NUM);
            return -EINVAL;
        }
 
        ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
        if (ret)
            return ret;
    }
 
    return 0;
}
//modify:添加 usdhc2_pads
iomux_v3_cfg_t const usdhc2_pads[] = {
    MX6_PAD_SD2_CLK__SD2_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_CMD__SD2_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_GPIO_4__GPIO1_IO04  | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
};
//eMMC
iomux_v3_cfg_t const usdhc4_pads[] = {
    MX6_PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
    MX6_PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
};

struct fsl_esdhc_cfg usdhc_cfg[2] = {
    {USDHC2_BASE_ADDR},//modify:修改 USDHC2_BASE_ADDR
    {USDHC4_BASE_ADDR},
};


int board_mmc_getcd(struct mmc *mmc)
{
    struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
    int ret;
 
    if (cfg->esdhc_base == USDHC2_BASE_ADDR) {//modify:修改 USDHC2_BASE_ADDR
        gpio_direction_input(IMX_GPIO_NR(1, 4));//modify:修改片选 IMX_GPIO_NR(1, 4)
        ret = !gpio_get_value(IMX_GPIO_NR(1, 4));//modify:修改片选 IMX_GPIO_NR(1, 4)
    } else if (cfg->esdhc_base == USDHC4_BASE_ADDR){
        ret = 1;/* eMMC is always present */
    }
    else{
        ret = -1;/* Don't have the CD GPIO pin on board */
    }
 
    return ret;
}
/* 此处不用修改                         
int board_mmc_get_env_dev(int devno)
{
    return devno - 1; 
}
*/
4.修改 include/configs/mx6qarm2.h
#define CONFIG_MXC_UART_BASE            UART1_BASE

5、编译
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-    //arm-none-eabi-
make mx6qarm2_defconfig
make -j8

六、在uboot中查看uboot在emmc中的烧录位置和数据
1、切换到当前板子使用的boot分区 mmc bootpart
2、切换到boot分区:mmc dev 3 1
3、也可以通过命令设置启动分区到第一分区或其他分区:mmc dev 3 1
4、读取boot分区第三个block(uboot烧录是从第三个block开始)的数据到0x10800000中:mmc read 0x10800000 0x2 0x01 
5、查看0x10800000内容,对比可知就是u-boot.bin的数据:md.b 0x10800000

七、在uboot中查看uImage在emmc中的烧录位置和数据
1、切换到0分区:mmc dev 3 0
2、读取0分区第2048个block(uImage烧录是从1M位置开始烧录)的数据到0x10800000中:mmc read 0x10800000 0x800 0x01
3、查看0x10800000内容,对比可知就是uImage的数据:md.b 0x10800000

八、在linux中查看uImage在emmc中的烧录位置和数据
1、mmcblk0p1:文件系统存放分区。
2、从emmc读入uImage的数据:dd if=/dev/mmcblk0 of=456 bs=1M skip=1 count=2
    通过hexdump 456 -n 100可以知道和烧录的uImage数据一致。
3、从emmc读入u-boot.bin的数据: dd if=/dev/mmcblk0boot0 of=456 bs=512 skip=2 count=4
    通过hexdump 456 -n 100可以知道和烧录的u-boot.bin数据一致。
    
    linux中EMMC写入使能:echo 0 > /sys/block/mmcblk0boot0/force_ro
                         echo 0 > /sys/block/mmcblk0boot1/force_ro
                         echo 0 > /sys/block/mmcblk0/force_ro
                         //没有该分区echo 0 > /sys/block/mmcblk0p1/force_ro
    linux中EMMC只读使能:echo 1 > /sys/block/mmcblk0boot0/force_ro

    linux清除指令:    dd if=/dev/zero of=/dev/mmcblk0p1 bs=1M count=1
                    dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=2
                    
    skip=xxx是在备份时对if 后面的部分也就是原文件跳过多少块再开始备份;
    seek=xxx则是在备份时对of 后面的部分也就是目标文件跳过多少块再开始写。    
                    
九、uboot中通过指令烧录uboot                    
1、下载文件到内存:tftp 0x10800000 u-boot.imx    
2、切换到uboot分区:mmc dev 3 1
3、烧录,根据u-boot.imx的大小确定块数:mmc write 0x10800000 2 2B6


十、编译内核
1、下载内核:git clone https://source.codeaurora.org/external/imx/linux-imx -b git.kernel.org/linux-stable/linux-4.18.y
    git checkout imx_4.9.88_2.0.0_ga
2、修改 imx6q-arm2.dts
//modify:添加
pinctrl_uart1: uart1grp {
    fsl,pins = <
        MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x1b0b1
        MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA 0x1b0b1
    >;
};

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart1>;
    status = "okay";
};

&usdhc2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_usdhc2>;
    bus-width = <4>;
    cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
    wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
    status = "okay";
};

pinctrl_usdhc2: usdhc2grp {
    fsl,pins = <
        MX6QDL_PAD_SD2_CMD__SD2_CMD        0x17059
        MX6QDL_PAD_SD2_CLK__SD2_CLK        0x10059
        MX6QDL_PAD_SD2_DAT0__SD2_DATA0        0x17059
        MX6QDL_PAD_SD2_DAT1__SD2_DATA1        0x17059
        MX6QDL_PAD_SD2_DAT2__SD2_DATA2        0x17059
        MX6QDL_PAD_SD2_DAT3__SD2_DATA3        0x17059
        MX6QDL_PAD_NANDF_D4__SD2_DATA4        0x17059
        MX6QDL_PAD_NANDF_D5__SD2_DATA5        0x17059
        MX6QDL_PAD_NANDF_D6__SD2_DATA6        0x17059
        MX6QDL_PAD_NANDF_D7__SD2_DATA7        0x17059
    >;
};

//modify:删除 &usdhc3 节点和 pinctrl_usdhc3
//modify:修改网络接口节点
pinctrl_enet: enetgrp {
fsl,pins = <
    MX6QDL_PAD_ENET_MDIO__ENET_MDIO        0x1b0b0
    MX6QDL_PAD_ENET_MDC__ENET_MDC        0x1b0b0
    MX6QDL_PAD_RGMII_TXC__RGMII_TXC        0x1b030
    MX6QDL_PAD_RGMII_TD0__RGMII_TD0        0x1b030
    MX6QDL_PAD_RGMII_TD1__RGMII_TD1        0x1b030
    MX6QDL_PAD_RGMII_TD2__RGMII_TD2        0x1b030
    MX6QDL_PAD_RGMII_TD3__RGMII_TD3        0x1b030
    MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL    0x1b030
    MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x1b0b0
    MX6QDL_PAD_RGMII_RXC__RGMII_RXC        0x1b030
    MX6QDL_PAD_RGMII_RD0__RGMII_RD0        0x1b030
    MX6QDL_PAD_RGMII_RD1__RGMII_RD1        0x1b030
    MX6QDL_PAD_RGMII_RD2__RGMII_RD2        0x1b030
    MX6QDL_PAD_RGMII_RD3__RGMII_RD3        0x1b030
    MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL    0x1b030
    MX6QDL_PAD_GPIO_16__ENET_REF_CLK    0x4001b0a8
>;
};

3.编译
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make imx_v7_defconfig
make uImage LOADADDR=0x12000000
make imx6q-arm2.dtb
4、在新uboot中启动内核,挂载网络文件系统
4.1先设置网卡参数
ifconfig ens38 192.168.1.103 netmask 255.255.255.0
route add default gw 192.168.1.1
setenv ipaddr 192.168.1.106
setenv serverip 192.168.1.101
setenv ethaddr 32:34:46:78:9A:DC
setenv gatewayip 192.168.1.1
4.2读入内核&&挂载网络文件系统
setenv bootargs 'noinitrd console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.103:/home/lonnox/work/imx6/nfs_root,v3,tcp ip=192.168.1.6:192.168.1.103:192.168.1.1:255.255.255.0'
//setenv bootargs 'noinitrd console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.104:/home/lonnox/work/imx6/nfs_root,v3,tcp ip=192.168.1.106:192.168.1.104:192.168.1.1:255.255.255.0'
tftp 0x11ffffc0 uImage
tftp 0x18000000 imx6q-arm2.dtb
setenv bootargs ${bootargs}
bootm 0x11ffffc0 - 0x18000000

5、在新uboot中烧录uImage和imx6q-arm2.dtb
mmc dev 1 0
tftp 0x11ffffc0 uImage
mmc write 0x11ffffc0 0x800 0x4000
tftp 0x18000000 imx6q-arm2.dtb
mmc write 0x18000000 0x5000 0x800

setenv bootargs 'noinitrd console=ttymxc0,115200 loglevel=8 root=/dev/mmcblk3p1 rw init=/linuxrc'
setenv bootcmd 'mmc dev 1; mmc read 0x11ffffc0 0x800 0x4000; mmc read 0x18000000 0x5000 0x800; bootm 0x11ffffc0 - 0x18000000'
saveenv
run bootcmd

十一、制作文件系统
1、测试烧录老版本文件系统
mksdcard.sh /dev/mmcblk1
//mkfs.ext3 -j /dev/mmcblk1p1    //???一定要使用mkfs.ext3
mke2fs -j /dev/mmcblk1p1  
mkdir -p /mnt/mmcblk1p0
mount -t ext3 /dev/mmcblk1p1 /mnt/mmcblk1p0
tar --numeric-owner -zxvf rootfs.tgz -C /mnt/mmcblk1p0
umount /mnt/mmcblk1p0

2018-08-17 17:18:23 lvxiong2007 阅读数 347

1 u-boot的优化
  1 首先去掉无关紧要的串口信息
  2 将CONFIG_BOOTDELAY改为0
  3 去掉一些不用的驱动,例如SPI、USB、HDMI等等
  4 关闭CONFIG_CMD_NET
  5 U-BOOT会重复初始化MMC,修改do_mmc_dev
  
2 KERNEL的优化
  1 首先打开CONFIG_PRINTK_TIME,这样每条printk的语句都会在前面打印一个时间,这样我们就可以很清楚的知道执行到每一条打印信息的时候的时间了。(优化完,正式发布的时候关闭,打印时间本省也会浪费时间的)
  2 在bootargs中增加initcall_debug=1,这样kernel启动后每调用驱动的init函数,都会将消耗的时间打印出来,这样我们可以将消耗时间长的初始化打印出来,进行优化。
  3 去掉不需要的驱动。
  4 将printk的打印级别调高,减少打印的信息。如果我们想看全部的打印信息,可以在系统启动后通过dmesg命令查看所有的打印信息。
  5 对于初始化中一些小于10 毫秒的sleep,由msleep改为mdelay,因为msleep会让出CPU的占用,而6Q是100hz,也就是说最快调度一次也很定要大于10ms,所以用mdelay会更快些。
  6 对于分配一些很大的内存用于DMA,通过dma_alloc_writecombine分配时间会很长,可以在setup_arch函数中通过alloc_bootmem来预留一块内存。
  7 对于初始化中用时比较长,但是不一定马上就需要的操作,可以移到open的时候执行,或者在初始化的时候开启一个工作队列,在工作队列中处理。
  8 在bootargs中增加 rootflags=data=writeback,这样加载rootfs的时间会快些。
3 init进程的优化
  initlog打印信息的时间比较长,可以将不需要的信息注释掉。
  console_init 函数会找有效的控制台串口,这个函数可以改为直接为console_dev赋值为定义的串口。

  init进程会调用/etc/rcS.d目录下Sxxxxx的脚本文件(S开头,然后是数据,之后是名称)。我们可以将不需要的脚本文件直接去掉,这样也可以节约不少时间。

 

4 驱动的优化

   对于一些不是马上就要用到的驱动,可以编译成KO文件,放在我们的主界面启动后在加载,或者在需要调用的时候在加载。

 

5 启动脚本的优化

   可以将我们主界面尽可能提前启动,将一些不是很紧急需要的脚本放到后面来启动。

2018-04-25 19:05:36 wince_lover 阅读数 277

现在大容量U盘越来越普及,很多大容量U盘都是exfat格式
但是原版的 imx6q Linux的BSP并不支持exfat
让imx6q支持exfat的方法如下
bitbake fuse-exfat
bitbake exfat-utils
然后在IMAGE的bb文件中加上
IMAGE_INSTALL += " fuse-exfat exfat-utils "
重新编译镜像。
下载镜像后,插上U盘,然后在命令行输入mount /dev/sda1 /mnt
既可以在/mnt目录下看到U盘里面的内容,可以读写里面的文件了。

linux API

阅读数 519

没有更多推荐了,返回首页