标签 Freescale 下的文章

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}三个变量定义。

OpenOCD使用OSBDM接口调试K60

折腾这么长时间,OpenOCD与OpenJTAG还是有无法连接的时候,特别是在对flash擦写后,OpenOCD会是示无法获知K60芯片的状态。幸好开发板上自带了OSBDM接口,使用通用的USB线与开发板连接即可。OpenOCD使用以下的配置文件:

telnet_port 4444
gdb_port 3333
gdb_memory_map disable
interface osbdm
reset_config srst_only

source [find target/k60.cfg]

$_TARGETNAME configure -event reset-init {
puts "-event reset-init occured"
}

#
# Bank definition for the 'program flash' (instructions and/or data)
#
flash bank pflash.0 kinetis 0x00000000 0x40000 0 4 $_TARGETNAME
flash bank pflash.1 kinetis 0x00040000 0x40000 0 4 $_TARGETNAME

MAC OS下搭建K60开发环境

公司项目中要使用K60的芯片,所以需要先行把相关的开发环境搭建起来.之前有中电器材的K60开板,直接在上面做部分开发。嵌入式上的开发环境基本上是两类,一类是IDE,一类是VIM+MAKE+CSCOPE。现在的很多芯片厂商都开始注重生态圈的建设,所以各家都有自己的IDE,而且多数是从Eclipse扩展出来的。另一类属于DIY型,芯片公司已经把Linux移植在芯片上,中间的构建过程都是由shell脚本和makefile文件组成,便于开发者使用。

自从MAC PRO到手后,就一直想在MAC OS下完成大多数的开发任务,不能浪费这么好的系统么。嵌入式开发过程需要软件和硬件的配合才得以完成,当然有些是硬件是在开发板上有提供。我使用的开发板是中电器材的K60(也没个正式的名字,就这样吧),芯片使用Freescale家的MK60N512ZVLQ10,板子分为CPU板和BASE板,CPU板以DDR接口形式插在BASE板上。因为芯片是ARM的,所以调试接口JTAG是支持的,Freescale又搞了OSJTAG使用MINI USB接口与PC相连。我这里使用的Debuger是韦东山的OpenJTAG,是由FTDI提供的USB转JTAG的芯片完成调试功能。

  1. 硬件连接

之前有写过文章openjtag debuger for freescale k60 chip,具体接线参考此文即可。需要购买mini jtag的头和排线。

  1. 软件配置

软件使用OpenOCD与OpenJTAG通讯,在MAC OS下直接使用brew安装即可

brew install openocd

brew中提供的openocd是0.8.0版本的。接下来是写openocd的配置文件,以便识别到OpenJTAG和开发板芯片。

telnet_port 4444
gdb_port 3333
gdb_memory_map disable

# interface for openjtag
interface ft2232
adapter_khz 1000
#jtag_speed 0
ft2232_vid_pid 0x1457 0x5118
ft2232_layout "jtagkey"
ft2232_device_desc "USB<=>JTAG&RS232"

# about target
source [find target/swj-dp.tcl]
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME k60
}

if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}

if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
set _CPUTAPID 0x4ba00477
}

set _TARGETNAME $_CHIPNAME.cpu
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
target create $_TARGETNAME cortex_m -chain-position $_CHIPNAME.cpu

cortex_m reset_config sysresetreq

#
# Bank definition for the 'program flash' (instructions and/or data)
#
flash bank pflash.0 kinetis 0x00000000 0x40000 0 4 $_TARGETNAME
flash bank pflash.1 kinetis 0x00040000 0x40000 0 4 $_TARGETNAME

然后执行openocd即可

sudo openocd -f k60.cfg

输出结果如下:

Open On-Chip Debugger 0.8.0 (2014-08-04-08:53)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
cortex_m reset_config sysresetreq
Info : add flash_bank kinetis pflash.0
Info : add flash_bank kinetis pflash.1
Warn : Using DEPRECATED interface driver 'ft2232'
Info : Consider using the 'ftdi' interface driver, with configuration files in interface/ftdi/...
Info : clock speed 1000 kHz
Info : JTAG tap: k60.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : k60.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : accepting 'telnet' connection from 4444
Info : accepting 'gdb' connection from 3333
undefined debug reason 7 - target needs reset
Info : JTAG tap: k60.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
  1. 调试程序

开发过程中,调试是必需的步骤,由其是嵌入式开发,很多问题基本是靠debug出来的,然后再解决掉。这里使用GDB调试,通过openocd连接,进行远端调试。

首先,在编译源码时,要编写linker文件,指定程序入口点为内存地址处,这样使用GDB时才可以把ELF文件加载在相应内存处,然后执行。当然,有时候你的RAM是外置的,需要先把RAM初始化后才可以使用。我使用了一个LED的小程序来测试调试的过程。

[k60_led_demo](https://github.com/Blackrose/k60_led_demo)

这里面有两个linker文件,调试时使用k60n128_ram.ld即可。在已经运行OpenOCD基础上,通过GDB连接OpenOCD的调试端口;

arm-none-eabi-gdb out/k60_gpio_demo.elf
target remote localhost:3333
monitor reset init
load

这时,会有加载成功的提示,接下来就与PC上的GDB调试相同了,break,continue之类的。

  1. 烧写程序

调试完成后,通常会把程序烧写进芯片,做外部功能性测试。烧写直接使用OpenOCD就可以了,编译时使用k60n512_flash.ld文件,这样程序是从FLASH的0x0处执行。以下是烧写过程:

telnet localhost 4444
reset init
flash write_image erase out/k60_gpio_demo.elf

等待完成后,断开OpenOCD和JTAG调试器,程序就可以独立运行在芯片上了。

嵌入式开发工具LTIB

公司从研华购入的板子RSB4210,使用LTIB作为开发工具,而我确一直在找单一的编译工具链,知道的越少就是浪费越多的时间呀。由于提供的kernel包含了USB OTG的驱动,导致无法启动。所以,就打算要重新编译kernel。

LTIB是的开源界的生产工具,目前主要由Freescale来赞助。Linux Target Image Builder就是LTIB的工作内容,在linux下进行嵌入式开发,各个版本和平台很混乱,LTIB就是用来解决这个问题的。


参考链接:
ltib
兔子等着瞧的BLOG
zhaole20094463的专栏
http://blog.csdn.net/jack5588liu270/article/details/6959439
http://blog.csdn.net/junht?viewmode=contents

最新文章

最近回复

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

分类

归档

其它