标签 nxp 下的文章

uramdisk解开和打包

看到群友在问大升iMX6UL SOM板卡商的SD卡升级方法,小分析下。SD只有一个VFAT分区,需要把升级文件和系统都copy到SD卡,同时将u-boot.imx文件写入SD卡的1024byte offset的位置上。启动后会加载kernel和filesystem。filesystem使用uramdisk方式。

uramdisk是一种带u-boot header信息的镜像文件。

解压

解开uramdisk,需要先把header部分去掉。去年后的ramdisk就是一个ext2的文件系统镜像。这里个ramdisk还可以是cpio或其它的方式。

dd bs=64 skip=1 if=uramdisk.gz of=ramdiskgz
gunzip ramdisk.gz
mkdir tmp
mount ramdisk tmp

制做

mkimage -A arm -T ramdisk -C gzip -d ramdisk.gz uramdisk.gz

系统启动后会执行/etc/init.d/rcS脚本,里面mount SD卡后就执行SD卡的setup程序了,这个就是最终的升级脚本命令了。这样做的好处是setup在SD卡,可以更灵活的修改升级方案。当然坏处是升级脚本容易被篡改,实际使用中升级的操作暴露在用户环境。

Linux下Mfgtool烧写i.MX6ULL芯片时错误"init op Failed code# 24"

NXP官方提供了Mfgtool软件将目标文件烧写到板载的存储设备中。官方打包的Mfgtool软件包内有mfgtool.exe和mfgtoolcli两个程序,分别支持Windows和Linux系统。但是我用Mfgtoolcli时一直提示"init op Failed code# 24"。查看MfgToolLib.log文件时显示如下:

invalid Device Name MX6ULL

在github上看到有官方的mfgtool代码,编译后可以使用。可以编译后替换官方mfgtool软件包内的libmfgtool.so文件。

https://github.com/NXPmicro/mfgtools

NXP i.MX6ULL EVK Yocto分析3

根据官方文档,上一篇是设置构建目录,下面就可以直接构建出目标Image了。

bitbake core-image-base

具体解释如下表格:

fsl-yocto-image.png

第一次构建时Bitbake会该Image需要的所有软件包的源码到DL_DIR指定的路径里,所以一般建议是先下载完,再构建。同时下载的源码包可以共享给其他人用,避免每次重新下载。根据本人的使用体验,在i7-4770 4 Core 8 Thread处理器 + 8G RAM + HDD上构建,需要三个小时左右。想加快速度提升CPU,RAM,SSD是可行的办法。实际上,得益于Bitbake的sstate缓存特性,随后的构建会更快,毕竟有cache嘛。

按照上篇的分析,应该先从fsl-release-bsp/sources/meta-fsl-bsp-release/imx/meta-bsp开始,但构建是从Image开始。至于前面配置的DISTRO和MACHINE,后面会慢慢分析。

core-image-base镜像

在source目录下查找后发再,core-image-base只有一个地方存在,上面的表格中也说明了core-image-base是来自poky的,NXP并没有修改。

./poky/meta/recipes-core/images/core-image-base.bb

这里要说明的一点的是MACHINE,DISTRO,Image之间的关系。网上很多Yocto的文章,并没有把这个讲清楚。举个例子,DISTRO就是Ubuntu,MACHINE就是Ubuntu支持的各种平台的设备,如amd64,arm,arm64,mips等等。Image就是在DISTRO,MACHINE框架下的具体镜像,对应Lubuntu,Kubuntu一类。从这一点上可以看出,Yocto宣传的也正是如些,让你构建一个适于自设备的嵌入式发行版。这和buildroot,busybox完全不在一个层面上,这两个只是达到了构建file system或system image的目的。

当然实际选择还是要从产品来分析的,Yocto这种需要配备开发人员。这和小公司的那种一个软件开发搞定一切的模式完全不一样。

上面扯这么多的意思就是,官方虽然没有修改core-image-base,但DISTRO和MACHINE也是定义要包含哪些软件包。

MACHINE的定义位置:

./meta-fsl-arm/conf/machine
./meta-fsl-arm-extra/conf/machine
./meta-fsl-bsp-release/imx/meta-bsp/conf/machine

meta-fsl-arm-extra是第三方厂商的板卡,不属于官方的,也就不再分析。从上一篇得出,meta-fsl-bs-release优先级比较高,就先从这里开始。

DISTRO的定义位置,只有一个,那就不用费话了。

./meta-fsl-bsp-release/imx/meta-sdk/conf/distro

MACHINE分析

对应文件是meta-fsl-bsp-release/imx/meta-bsp/conf/imx6ull14x14evk.conf。文件内容比较少,包含三个header文件,添加两个firmware,规定了kernel的需要的dtb和uboot构建用的的config文件。

include conf/machine/include/imx-base.inc
include conf/machine/include/tune-cortexa7.inc
include conf/machine/include/imx6ul-common.inc

SOC_FAMILY = "mx6ul:mx6ull"

imx-base.inc是存放置是meta-fsl-arm/conf/machine/include/imx-base.inc。imx-base.inc中是i.MX系列芯片的通用配置,分别定义了uboot的binary格式,文件后缀。SoC相关的硬件功能,如图形加速,音视频解码。kernel的软件包名。镜像的格式和FEATURE。下面把i.MX6ULL相关的提出来:

UBOOT_MAKE_TARGET ?= "u-boot.imx"
UBOOT_ENTRYPOINT_mx6ul  = "0x10008000"
DEFAULTTUNE_mx6ul ?= "cortexa7thf-neon"
MACHINE_SOCARCH_SUFFIX_mx6ul = "-mx6ul"
IMX_DEFAULT_KERNEL = "linux-imx"
PREFERRED_PROVIDER_virtual/kernel ??= "${IMX_DEFAULT_KERNEL}"
SOC_DEFAULT_IMAGE_FSTYPES = "sdcard.gz"
SDCARD_ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4"
IMAGE_FSTYPES ?= "${SOC_DEFAULT_IMAGE_FSTYPES}"
SERIAL_CONSOLE = "115200 ttymxc0"
KERNEL_IMAGETYPE = "zImage"

MACHINE_FEATURES = "apm usbgadget usbhost vfat alsa touchscreen"

# Add the ability to specify _imx machines
MACHINEOVERRIDES =. "imx:"

imx6ul-common.inc内容如下:

DEFAULTTUNE_mx6ul ?= "cortexa7hf-neon"

# mx6 GPU libraries
PREFERRED_PROVIDER_virtual/egl_mx6ul = "mesa"
PREFERRED_PROVIDER_virtual/libgles1_mx6ul = "mesa"
PREFERRED_PROVIDER_virtual/libgles2_mx6ul = "mesa"
PREFERRED_PROVIDER_virtual/libgl_mx6ul = "mesa"
PREFERRED_PROVIDER_virtual/libg2d_mx6ul = ""

# MESA DRI library
XSERVER += "mesa-driver-swrast"

MACHINE_SOCARCH_FILTER_mx6ul = "imx-codec imx-parser gst-fsl-plugins"

上面的定义配合SOC_FAMILY变量的值就很明白了。

DISTRO分析

在构建前的初始化操作中,DISTRO=fsl-imx-fb。这个fsl-imx-fb是在./meta-fsl-bsp-release/imx/meta-sdk/conf/distro/fsl-imx-fb.conf。文件包含两个header文件,同时声明不包含x11, wayland, directfb特性。

include conf/distro/include/fsl-imx-base.inc
include conf/distro/include/fsl-imx-preferred-env.inc

fsl-imx-base.inc文件定义DISTRO相关的版本信息,FEATURE信息,其中BBMASK是不处理列举的bb或bbappend文件。这里看到fsl-imx-fb是不包含gstreamer-1.0-plugin-bad, qtbase和meta-fsl-arm下的linux-imx, linux-imx-mfgtool, firmware-imx, core-image-weston.bbappend文件。

BBMASK = "meta-fsl-arm/recipes-kernel/linux/linux-imx_4.1.15.bb"
BBMASK .= "|meta-fsl-arm/recipes-kernel/linux/linux-imx-mfgtool_4.1.15.bb"
BBMASK .= "|meta-freescale/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend"
BBMASK .= "|meta-fsl-arm/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend"
BBMASK .= "|meta-fsl-arm/recipes-bsp/firmware-imx"

BBMASK .= "|meta-fsl-arm/recipes-graphics/images/core-image-weston.bbappend"

bitbake解析后的DISTRO_FEATURES:

DISTRO_FEATURES="alsa argp bluetooth ext2 irda largefile pcmcia usbgadget usbhost wifi xattr nfs zeroconf pci 3g nfc ipv4 ipv6 libc-backtrace libc-big-macros libc-bsd libc-cxx-tests libc-catgets libc-charsets libc-crypt libc-crypt-ufc libc-db-aliases libc-envz libc-fcvt libc-fmtmsg libc-fstab libc-ftraverse libc-getlogin libc-idn libc-inet-anl libc-libm libc-locales libc-locale-code libc-memusage libc-nis libc-nsswitch libc-rcmd libc-rtld-debug libc-spawn libc-streams libc-sunrpc libc-utmp libc-utmpx libc-wordexp libc-posix-clang-wchar libc-posix-regexp libc-posix-regexp-glibc libc-posix-wchar-io largefile opengl ptest multiarch bluez pulseaudio sysvinit bluez5 gobject-introspection-data"

主要由${DISTRO_FEATURES_DEFAULT} ${DISTRO_FEATURES_LIBC} ${IMX_DEFAULT_DISTRO_FEATURES}三个变量定义。

Freescale i.MX28 AUART应用RS485

0x0

最近有客户使用i.MX28的SOM模块开发产品,其中用到了RS485通讯,发现发送时延时在百毫秒级,由于上层应用协议要求是微秒级,客户要求减少发送的延时。问题看起来很简单,解决起来也是小波折。总归还是自己对kernel知识理解不够深入。

0x1

了解问题背景后,就去看AUART的实现代码,之前开发imx28的同事已经在mxs_auart_tx_chars()的前后加入了gpio的操作,

static inline void mxs_auart_tx_chars(struct mxc_auart_port *s)
{
    if(s->port.line == 1){
        gpio_set_value(MXS_AUART_RS485_EN, 1);
    }

    // ignore more send code

    if (s->port.line == 1) {
        do {
            status = __raw_readl(s->port.membase + HW_UARTAPP_STAT);
        } while (!(status & BM_UARTAPP_STAT_TXFE) || (
            status & BM_UARTAPP_STAT_BUSY));
        gpio_set_value(MXS_AUART_RS485_EN, 0); // Add by JBO, Disable send
    }
}

细看之后觉得do while用法在这里可能是问题的根源。看了下有mxs_auart_stop_tx(),应该放在里面做符合tty规范么,结果一测,发现stop_tx就没有执行。然后翻datasheet和代码,才知道auart没有FIFO Empty的中断,所以TX中断后要polling去查FIFO Empty flag再拉gpio。然后在网上看到有网友的解决相同问题的记录,依样画瓢改成tasklet处理了。其中也是小状况,就这位网友说的那样,"很多事情都是想得简单,做起来的时候各种意外"。

这里把gpio的操作放在了start_tx()和stop_tx()里面了,mxs_auart_tx_chars()里的检查xmit buf为空后,执行tasklet_hi_schedule(&my_task0);启动tasklet任务,然后由rs485_mode_func()来检查FIFO是否为空,再操作gpio。

void rs485_mode_func(unsigned long data)
{
     struct uart_port *u = data;
     struct mxs_auart_port *s = to_auart_port(u);
     int status;
 
     dev_dbg(s->dev, "%s: control RS485 line\n", __FUNCTION__);
     if (s == NULL)
         return;
     if (s->port.line == 1){
         if(!(readl(s->port.membase + HW_UARTAPP_STAT) & BM_UARTAPP_STAT_TXFE)){
             udelay(10);
             tasklet_hi_schedule(&my_task0);
         }else{
             mxs_auart_stop_tx(&s->port);
         }
     }
}

Reference

linux rs485 GPIO 方向控制问题

i.MX6UL编译OpenWrt系统

几年前在思科的Wrt54G路由器上尝试各种OpenWrt的固件(PS或许这也是踏上嵌入式不归路的开始征兆),这次可以学习下如何给i.MX6UL/i.MX6ULL编译OpenWrt的镜像。由于只是用OpenWrt的系统,所以uboot和kernel是现成的。这里,把整个系统放在SD卡上,两个分区,一个分区为uboot.imx, zImage, dtb,第二个分区是OpenWrt的文件系统。

编译

编译过程相比多年前简单多了,直接下载,同步feeds,配置config文件的步骤就可以了。

git clone https://github.com/openwrt/openwrt
cd openwrt
./script/feeds update -a
./script/feeds install -a
make menuconfig
make -j4

"make menuconfig"的配置要修改的地方如下:

CONFIG_TARGET_imx6=y
CONFIG_TARGET_imx6_Generic=y
CONFIG_DEFAULT_TARGET_OPTIMIZATION="-Os -pipe -march=armv7-a -mtune=cortex-a7 -mfpu=neon"

其它的配置看自己需要启动就可以了,luci是必需要选的。

运行截图

分别是终端上查看cpuinfo信息和luci上显示系统状态信息截图。

mys6ulx-OpenWrt-cpuinfo.png
mys6ulx-OpenWrt-luci.png

NXP i.MX6UL使用Yocto构建文件系统

知识共享许可协议
本作品采用知识共享署名-禁止演绎 4.0 国际许可协议进行许可。

配置环境

i.MX6UL或i.MX6ULL的Yocto项目是由多个项目组成的,为了便于项目管理,每个项目是一个仓库,所以用到了repo工具来对多个项目仓库管理。同时也方便用户使用,不用单独下载。

首先要下载repo工具,这个是由google提供的,所以要提前准备好科学上网工具,才能够下载成功。下载后的repo文件是存放在Home下的bin目录里。同时把这个路径配置到PATH环境变量内,可以方便使用repo命令。

mkdir ~/bin (this step may not be needed if the bin folder already exists)
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:$HOME/bin

配置Git个人信息

repo要求下载项目代时,git要有用户名和邮箱的标识。

git config --global user.name "Your Name"
git config --global user.email "Your Email"
git config --list

下载fsl的Yocto项目代码

准备好的,就可以使用repo init初始化仓库,再用repo sync来同步所有的代码,这个时间会比较长,取决于网络速度。下载过程中可能会因网络超时退出,可以多次执行repo sync命令,直到下载完成。

mkdir fsl-release-bsp
cd fsl-release-bsp
repo init -u git://git.freescale.com/imx/fsl-arm-yocto-bsp.git -b imx-4.1-krogoth
repo sync

imx6ul的Yocto项目目录结构如下:

├── fsl-setup-release.sh
├── README
├── README-IMXBSP
├── setup-environment
└── sources
    ├── base
    ├── meta-browser
    ├── meta-fsl-arm
    ├── meta-fsl-arm-extra
    ├── meta-fsl-bsp-release
    ├── meta-fsl-demos
    ├── meta-myir-imx6ulx
    ├── meta-openembedded
    ├── meta-qt5
    └── poky

最新文章

最近回复

  • Blackrose: 感谢拍砖!嗯,那句话...
  • aa: “Raspberry...
  • Blackrose: 外部只是帮你把芯片启...
  • : 内部时钟比外部的频率...
  • Blackrose: 你这评论比正文更有内容么
  • 7hao: CR+LF ...
  • Blackrose: 可以是你更新软件源后...
  • sxk: 博主,我的系统是ub...
  • Blackrose: 你深得精髓么
  • qihao: 这篇文章的简单总结就...

分类

归档

其它