1 开发环境介绍
开发环境连线
开发板设置
NUC970系列芯片支持多种启动模式: SPI启动、Nand Flash启动、eMMC启动、USB ISP模式。启动模式可以通过PA[1:0]来设置。另外,管脚复用可通过跳线根据系统需求来设置,具体可以参考开发板使用文件来做相应的设置。
2 BSP安装2.1 系统需求
建立linux开发环境,需要有安装linux环境,可以安装在pc上或安装在虚拟机上。
具体请参考BSP使用手册。
2.2 BSP相关库
Patch 用来打补丁的工具
Libc6-dev 交叉编译所需的动态连接的32位函数库(i386版本)
Libncurses5-dev 设置内核接口所需使用的动态连接库
Minicom 或cutecom 串口工具用来显示以及控制uboot及内核
2.3 BSP安装步骤
Linux BSP包含了三个目录,各目录下的内容如下:
l /BSP:一个压缩包,包含了U-Boot,Linux内核、范例程序的源码、交叉编译工具、以及根文件系统。
l /Documents:BSP相关说明文件
l /Tools:Windows上的烧写工具及驱动程序
将BSP目录中的压缩包复制到Linux开发机器上,使用下面的命令解压缩:
#tar zxvf nuc970bsp.tar.gz
#cd nuc970bsp
在此目录中有安装脚本install.sh。此脚本需要管理者权限才可以执行,可以选择使用“su”命令切换到管理者来执行。
#su
#./install.sh
或是使用sudo来执行安装脚本(若是安装的Linux没有开放root权限,例如Ubuntu,则可以使用本方式来安装BSP)
# sudo ./install.sh
以下是整个安装过程:
若是使用的Linux开发环境之前已经安装过新唐提供的交叉编译工具,安装脚本会询问是否要重新安装交叉编译工具,否则脚本并不会询问使用者,而是直接在/usr/local/arm_linux_4.3目录安装编译工具。在第一种情况下,若要重新安装可输入Y(或者是yes、y、YES),然后按Enter键。
完成交叉编译工具后,安装脚本会询问安装Linux内核、U-Boot、以及范例程序的绝对路径。安装完成后的bsp目录内容如下:
l applications:范例程序及开源程序
l image/kernel:使用默认设置编译好的内核
l image/U-Boot:使用默认设置预先编好的支持NAND或SPI Flash的U-Boot执行文件及环境变量env.txt文件。其中U-Boot的默认执行地址均为0xE00000。
l linux-3.10.x:内核源代码
l rootfs:根文件系统
l uboot:U-Boot源码
安装脚本会尝试为安装的目录设置正确权限,并将交叉编译器的路径增加到系统搜索路径($PATH)中。但在有些Linux版本中,可能发生无**确设置的问题。此时需要麻烦用户手动设置正确的权限且将/usr/local/arm_linux_4.3/usr/bin加到$PATH中。
请注意,在安装完成后,用户需要先登出再登入,$PATH的设定才会生效。
3 Linux内核配置3.1 内核设置界面
Linux内核支持各种不同设置,可将不需要的功能移除,只保留需要的功能,减少内核消耗的资源。
要进入内核设置界面,请在linux-3.10.x目录下输入“make menuconfig”的命令,即可进入内核设置界面。
内核设置菜单是多层次的。在当前页面内,可通过上、下、左、右四个方向键选择菜单的位置。上下键选择要控制的内核功能,左右键则是用来选择最下排的功能按钮。按“Enter”键进入下层菜单。最下排按钮共有5个,依次为Select、Exit、Help、Save、Load,具体功能如下:
l Select:当停留在该键时,用空格键选择内核功能。[ ]表示该功能禁止,不编进内核,该功能选中编进内核,[M]表示编译成模块,需手动加载。
l Exit:返回上一菜单,若为最上层菜单则提示是否要保存并退出。
l Help:选择显示帮助
l Save:保存当前设置
l Load:载入已保存设置
在设置完成后,内核设置会保存到linux-3.10.x目录下的.config文件中。
3.2 默认设置
新唐为NUC970系列芯片提供了默认设置,建议用户在更改内核设置前,先加载默认设置,再进行更改。加载默认设置的命令如下:
#make _defconfig
其中:可设为:nuc972,nuc973,nuc976,nuc977
例如:#make nuc972_defconfig //加载NUC972的默认设置。
有时因内核设置错误造成无法开机时,可通过默认设置来恢复到可开机状态。
3.3 LINUX内核设置
本节根据不同的驱动或功能,介绍所需要使能的内核设置。
3.3.1 基本系统设置
l 使能模块加载功能
有些驱动程序只支持动态加载,例如USB WiFi驱动程序、USB device的驱动等。使能模块加载功能支持,系统启动后可通过insmod命令来加载驱动模块。
l 模块卸载功能
使能模块加载功能支持后,若系统需要支持动态卸载功能,则需要按下图设置模块卸载功能支持。这样就可以使用rmmod来卸载模块了。
l 启动命令设置
用来设置系统启动参数,如根文件系统类型、内存大小、console波特率等。以下只是一个简单的设置,详细说明请参考Documentation/kernel-parameters.txt。
3.3.2 网络功能设置
l TCP/IP设置
使能网络功能设置如下:
l WiFi无线网络设置
若要使用无线网络设备,除了要设置上面的TCP/IP外,还需要设置下面的选项。
3.3.3 驱动配置 l Audio音频接口配置 I2S接口的配置如下: I2S支持主模式或从模式,用户可根据需要选择两者之一。 选定I2S后,将同时选中NAU8822 codec驱动。另外,配置codec驱动时必须配置I2C接口驱动,系统才能正确加载NAU8822设备。 如果audio应用程序是使用旧的OSS架构编写的,需要配置下面两项,使ALSA兼容OSS架构。可参口音频演示程序alsa_audio。(源代码位于BSP/applications/demos/alsa_audio目录下) l Cryptographic Accelerator配置 要支持Cryptographic Accelerator,前先配置Networking support里的PF_KEY socket。 然后再打开Cryptographic API里面的相关设定 NUC970 Cryptographic Accelerator硬件支持AES、DES及3-DES crypto加密算法,以及支持SHA及HMAC hash算法,可参考Demo程序crypto。(代码位于BSP/applications/demos/crypto目录下) l DMA配置 NUC970系列芯片支持DMA功能。要在内核中使能DMA,需进入“DMA Engine support”菜单,配置“NUC970 DMA support”。 如果需要在内核中使用DMA,请参照linux-3.10.x/drivers/dma/dmatest.c中的使用方法,如果需要实际了解dmatest.c的运作流程,可开启“DMA Test Client”。DMA test client将会被自行带起来。 l Ethernet网口配置 NUC970系列支持两个网口,可分别开启或同时开启。要支持网口除了网口驱动外,PHY驱动也需要配置。NUC970开发板上使用的是ICPlus的PHY,若是使用其它的PHY,请配置相应的PHY驱动。 l Etimer配置 NUC970内核执行时,使用基本时钟来计时。另外还提供了四通道的加强型时钟,可输入50%占空比的输出或是支持捕获功能。四个通道可独立控制,以下是相关的配置界面,不使用的可配置成“No output”或“No input”。下图是把通道0和1配置成分别使用PC.6、PC.8输出,通道2和通道3配置成使用PC.11和PC.13作为捕获管脚的例子。 应用程序可使用ioctrl()来控制Etimer的功能,目前支持了toggle out、trigger counting mode及free counting mode等三个功能。在捕获模式下(trigger counting mode及free counting mode),所捕获到的值可由read()读回(单位是us),代表了两次触发条件的间隔。不论是toggle out或是捕获模式单位均为us。可参考BSP中的demo程序(源码位于BSP/applications/demos/etimer)来开发所需要的功能。 l GPIO配置 NUC970系列芯片支持GPIO控制接口,要让内核支持GPIO控制,需配置“NUC970 GPIO support”及“/sys/class/gpio/…”。 GPIO驱动程序将NUC970系列芯片的GPIO口从GPIOA~GPIOJ每组都保留32个号码,所以GPIOA编号0x000~0x01F,GPIOB编号0x020~0x03F,GPIOC编号0x040~0x05F,GPIOD编号0x060~0x07F,GPIOE编号0x080~0x09F,GPIOF编号0x0A0~0x0BF,GPIOG编号0x0C0~0x0DF,GPIOH编号0x0E0~0x0FF,GPIOI编号0x100~0x11F,GPIOJ编号0x120~0x13F。 用户可通过sysfs接口来控制各GPIO。“/sys/class/gpio/…”是通用的GPIO控制接口,可以通过下面的方法来控制GPIO: l /sys/class/gpio/export:打开某个GPIO l /sys/class/gpio/unexport:关闭某个GPIO l /sys/class/gpio/gpio0/direction:控制GPIOA00的方向in或out l /sys/class/gpio/gpio0/value:控制GPIOA00的输出值1或0 下面是设定GPIOA0输出High的例子: 也可以参考demo程序gpio_demo(源码位于BSP/applications/demos/gpio目录) 在其他的驱动程序中可以通过下列步骤来控制GPIO: l 在驱动程序中加入#include l 依据archarmmach-nuc970includemachgpio.h决定使用哪个GPIO l 以NUC970_PC7为例,具体控制如下: 设定输入模式:gpio_direction_input(NUC970_PC7) 设定输出模式和输出值:gpio_direction_output(NUC970_PC7,1) 设定输出high:gpio_set_value(NUC970_PC7,1) 设定输出low:gpio_set_value(NUC970_PC7,0) 取值:gpio_get_value(NUC970_PC7) 确认GPIO是否正在使用:gpio_request(NUC970_PC7,”NUC970_PC7”) 获取GPIO中断号码:gpio_to_irq(NUC970_PC7) 使用GPIO中断的例子: l 配置GPIO模拟I2C接口 除了使用硬件I2C,还可使用GPIO来模拟实现I2C,通过修改arch/arm/mach-nuc970/dev.c中i2c_gpio_adpater_data结构来选择使用的管脚。如设定 .sda_pin=NUC970_PG1, .scl_pin = NUC970_PG0 即时是使用PG0为SCL,使用PG1为SDA。 l I2C接口配置 I2C接口配置如下: I2C Port 1有多组管脚供选择,如Port-B、Port-G、Port-H或者Port-I 选择硬件I2C,系统将使用NUC970内建的I2C控制器进行I2C的控制 I2C port0 上挂载了5个设备,分别是OV7725、OV5640、NT99050、NT99141及NAU8822,用户可自行修改、新增设备或将设备修改至port1上,只要修改文件arch/arm/mach-nuc970/dev.c中的nuc970_i2c_clients0结构。 |
clip_image080_thumb-1.jpg (35.36 KB, 下载次数: 1)
clip_image078_thumb-1.jpg (90.08 KB, 下载次数: 0)
clip_image076_thumb-1.jpg (82.74 KB, 下载次数: 1)
clip_image074_thumb-1.jpg (8.77 KB, 下载次数: 1)
clip_image072_thumb-1.jpg (40.15 KB, 下载次数: 1)
clip_image070_thumb-1.jpg (33.07 KB, 下载次数: 0)
clip_image068_thumb-1.jpg (9.57 KB, 下载次数: 1)
clip_image066_thumb-1.jpg (25.6 KB, 下载次数: 0)
clip_image064_thumb-1.jpg (50.53 KB, 下载次数: 1)
clip_image062_thumb-1.jpg (40.95 KB, 下载次数: 0)
clip_image060_thumb-1.jpg (65.6 KB, 下载次数: 1)
clip_image058_thumb.jpg (8.17 KB, 下载次数: 2)
clip_image056_thumb.jpg (13.58 KB, 下载次数: 2)
clip_image054_thumb.jpg (38.89 KB, 下载次数: 1)
clip_image052_thumb-1.jpg (48.43 KB, 下载次数: 0)
clip_image050_thumb-1.jpg (63.31 KB, 下载次数: 1)
clip_image048_thumb-1.jpg (89.63 KB, 下载次数: 1)
clip_image046_thumb-2.jpg (28.17 KB, 下载次数: 1)
clip_image044_thumb-2.jpg (57.04 KB, 下载次数: 0)
l RS232、RS485、IrDA串口配置 NUC970系列带有11个串口,可以分别独立配置,请按下面的说明来使能串口功能。每个串口可以单独的开关。除UART0、UART3、UART5外,其他串口都有多组管脚可选择,需要一起设置。其中,UART0这组串口是保留给console使用的,不需要在这里配置。 若是把串口作为红外控制使用,除了需要使能串口功能外,还需要按照下面配置红外模块的驱动选项: l SD卡配置 NUC970支持两个SD卡接口,目前的驱动只能选择使用其中之一,不能同时使用两个SD。若选择使用SD1,需要配置使用的管脚,可选择Port E、Port H或Port I。 系统启动后,若是检测到有卡插入,会在/dev下出现一个mmcblk0的设备。若卡上有分区,会依分区方式另外出现mmcblk0、mmcblk1等设备。 l SPI接口配置 NUC970系列芯片支持两个SPI接口,可以单独使能或同时使能,下面是同时使能两个SPI接口的配置: SPI port 0 管脚可选择Normal(4PIN)或Quad(6PIN)模式。 SPI port 1则可选择Port B/Port I(Normal mode)或者Port B/Port I(Quad mode)。 如要使用SPI flash,需要开启MTD功能,配置如下选项: 另外,还要配置JFFS2文件系统后,才能正确使用SPI Flash设备。 JFFS2文件系统的设置方式请参考文件系统配置的章节。 Linux内核需正确识别SPI flash后,才能对其读写。要让内核识别新的SPI flash,请 修改/新增driver/mtd/devices/m25p80.c中的m25p_ids结构。 以及 arch/arm/mach-nuc970/dev.c中的nuc970_spi_flash_data结构。 其中 .type字段需与m25p_ids结构中的其中一个字段相同,否则无法匹配到正确的设备。 如想修改SPI Flash partition数,则可修改 arch/arm/mach-nuc970/dev.c中的nuc970_spi_flash_partitions结构。 |
4.2 交叉编译
有时在一些项目中需要移植软件到ARM平台,许多开源软件都已支持交叉编译,此时只要根据那些软件的说明文档进行交叉编译即可。
但有时遇到那些不支持交叉编译的软件时,就需要手动来更改Makefile。一般来说更改过后的Makefie与原始版本相近,只须做小幅更改就可支持交叉编译。下面列出了需要修改的部分。
l 编译工具的前缀字。如原本的Makefile设定gcc为编译工具,则在新的Makefile需要改成交叉编译工具arm-linux-gcc。其他如as、ld等工具也须更改为arm-linux-as及arm-linux-ld。
l 库文件及头文件所在的路径需作相应修改。交叉编译不使用x86系统下的glibc。而是使用工具链中所提供的占用系统资源比较少的uClibc。
下面列出了一个简单的交叉编译Makefile供参考: