NU970 板子调试
本文地址:http://tongxinmao.com/Article/Detail/id/374
NU970 板子调试
自画板: ETREE
P1 USBID P2 (OTGID)
P5 PA5 P5 调试串口选择,低使能UART0 输出调试信息
P6 PA4 P6 jtga选择 ,1使用,0用作IO
P7 PA3 P7 看门狗选择 ,接高使能
JP2 PA0 PA1 P3P4 (boot选择)
PA1 PA0 boot:
00 usb
11 spiflash
01 emmc
10 nand
如果不通过命令行传启动信息则在LINUX内核中定义分区地址信息:
/arch/arm/mach-nuc970/dev.c
{
.name = "kernel",
.size = 0x0800000,
.offset = 0,
},
{
.name = "rootfs",
.size = 0x0800000,
.offset = 0x0800000,
},
mkfs.jffs2 -n -l -s 0x1000 -e 64KiB -d jffs2 -o jffs2.img --pad=0x100000
说明:
页大小0x1000 4k
块大小0x10000 64k
* 使用空文件夹时制作镜像OK,否则会出错原因未知
mkfs.jffs2 -n -l -s 0x1000 -e 64KiB -d jffs2 -o jffs2.img --pad=0x100000
-s, --pagesize=SIZE 节点页大小(默认: 4KiB)
-e, --eraseblock=SIZE 设定擦除块的大小为(默认: 64KiB)
-p, --pad[=SIZE] 用16进制来表示所要输出档案的大小,也就是root.jffs2的size。
jffs2分区总空间0x100000即1M,生成的镜像文件刚好1M
#dd if=/nfs/image/jffs2.img of=/dev/mtdblock3
mount -t jffs2 /dev/mtdblock3 /var/
│http://zero.lichee.pro/%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/SPI_flash_build.html
//
dragino2_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,1088k(kernel),6656k(rootfs),64k(NVRAM),64k(ART)ro,7744k@0x50000(firmware)
必须按SECTOR(64K) 加
bootargs=root=/dev/ram0 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M mtdparts=m25p80:512k(u-boot)ro,64k@0X80000(u-boot-env)ro,14336k@0X200000(kernel),1024k@0xF00000(cfg_data)
m25p80 与LINUX平台配置里的分区表名称要一样
内核启动:
/dev/mtdx 是字符设备 可以用mtdutil 操作
/dev/mtdblockx 可以挂载
烧写地址(spi):
uboot.bin 0x0 执行地址0xe00000 size:0x80000 =512k
env: 0x80000 size:0x10000 =64k
uimage: 0x200000 size:0XE00000
DDR: 0X8000
0---uboot----512kB---env---576kB----pad---2MB-------LINUX(13M)---15MB------CONFIG(1M)----16M
UBOOT设置启动参数
set bootcmd sf probe 0 18000000\;sf read 0x7fc0 0x200000 0xe00000\;bootm 0x7fc0
saveenv
(0xa00000 改为0XE00000 因为内核体积大了 14m)
EVN.TXT
baudrate=115200
bootdelay=1
ethact=emac
ethaddr=00:00:22:44:66:88
stderr=serial
stdin=serial
stdout=serial
bootcmd=sf probe 0 18000000\;sf read 0x7fc0 0x200000 0xE00000\;bootm 0x7fc0
watchdog=off
bootargs=root=/dev/ram0 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M loglevel=7 mtdparts=m25p80:512k(u-boot)ro,64k@0X80000(u-boot-env)ro,14336k@0X200000(kernel),1024k@0xF00000(cfg_data)
UBOOT-ENV大小在UBOOT配置文件中配置
LINUX下读写ENV可以使用uboot提供的env工具(make env), 也可以应用程序链接此工具库
ln -s fw_printenv fw_setenv
uboot编译:
make distclean
//make nuc970_config
make nuc970_nonand_config
make all
1、 P3 P4不接跳线 从SPI启动, 如果要从USB启动烧写要接高电平
2、P2是OTG ID, 要接上面才能认到USB设备 烧写时跳线不要接任何一个
3、RTL8188 无线网卡没有驱动, 驱动放入DRIVER, 修改上层Kconfig 和MAKEFILE 重新编译就有了
4、NU-WRITER 烧写时进度条无反应
5、lrztz可用
6、mount -t nfs 192.168.3.130:/nfs /mnt -o nolock 内核要启用NFS否则会出错
7、ifconfig eth0 up ifconfig eth0 192.168.3.6
8、USB TF能加载
udhcpc -i eth0 udhcpc -i wlan0 自动获取IP
//无线工具编译:https://blog.csdn.net/wenjs0620/article/details/51669869
在/etc下添加wpa_supplicant.conf文件,内容如下
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="wifi热点帐号"
psk="wifi热点密码"
key_mgmt=WPA-PSK
proto=WPA2
pairwise=CCMP
group=CCMP
}
启动热点连接:
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 -B
RTL8723BU:
http://www.emyard.com/?p=560
cgi: httpd只支持cgi, lighthttpd可以支持fastcgi和LUA
busybox httpd -l /
mkdir /cgi-bin
vi /cgi-bin/test
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo ""
echo ""
echo "
"
echo "Environment variables"
echo ""
env
echo ""
echo "========================================================="
echo ""
echo "Form variables :"
echo ""
read QUERY_STRING
eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
tmp=`httpd -d $Text_Field`
echo "Text_Field=$tmp"
tmp=`httpd -d $Radio_Button`
echo "Radio_Button=$tmp"
tmp=`httpd -d $Text_Area`
echo "Text_Area=$tmp"
echo "
"
echo ""
CGI也可以用C写,第一句要printf("Content-type:text/html\n\n");
LIBUSB
./configure --host=arm-linux CC=arm-linux-gcc RANLIB=arm-linux-ranlib --prefix=$PWD/output --disable-udev
将文件系统编译进镜像文件
eneral setup--->|
|[*]Initial RAM filesystem and RAM disk (initramfs / initrd) support
|(../rootfs)Initramfs source file(s)
Build-in initramfs compression mode (Gzip)
2、编译并安装内核模块到rootfs/
make -C linux O=build ARCH=arm CROSS_COMPILE=${CROSS_COMPILE} -j4 INSTALL_MOD_PATH=output modules
make -C linux O=build ARCH=arm CROSS_COMPILE=${CROSS_COMPILE} -j4 INSTALL_MOD_PATH=output modules_install
IW:
https://blog.csdn.net/lidroid/article/details/46725675
libnl-3.2.24.tar.gz
./configure --host=arm-linux --prefix=$PWD/tmp
iw-4.0.tar.gz
export PKG_CONFIG_PATH=/work/wifi/sta/libnl-3.2.24/tmp/lib/pkgconfig:$PKG_CONFIG_PATH
make CC=arm-linux-gcc
RTL8723BS 原装正品 蓝牙BT+WIFI模块二合一 SDIO接口 MID
RTL8723BU WIFI+蓝牙2/4二合一模块 USB接口
PHP
./configure --prefix=/home/nuc970/nuc970bsp/applications/php-src-php-5.6.33/output --host=arm-linux --with-sqlite3=$(pwd)/../sqlite-autoconf-3280000/output/ --with-pdo-sqlite --enable-cjson --with-libxml-dir=$(pwd)/../libxml2-2.7.8/output --with-zlib --disable-all --disable-fileinfo --enable-filter --enable-pdo --enable-embed=shared --enable-mbstring --enable-sockets --enable-pcntl --without-mcrypt --enable-mbstring --enable-zip -enable-json --with-curl=$(pwd)/../curl-7.64.1/output --with-openssl host_alias=arm-linux CC=arm-linux-gcc --with-config-file-scan-dir=/etc
EXTENSION:
../../output/bin/phpize .
./configure --host=arm-linux CC=arm-linux-gcc --with-php-config=../../output/bin/php-config
mosquitto1.4.9:
make WITH_SRV=no CC=arm-linux-gcc CXX=arm-linux-g++
如果要指定ssl的库位置
make WITH_SRV=no CC=arm-linux-gcc CXX=arm-linux-g++ CFLAGS="-I/thirdparty/include/ -L/thirdparty/lib" LDFLAGS="-L/thirdparty/lib -lssl -lcrypto"
php-mqtt-ext:
./configure --host=arm-linux --with-mosquitto=/path/to/libmosquitto
EXT编译进内核:
源码要放到EXT
需要增加--enable-swoole-static和--with-swoole两项编译配置参数
GPIO:
GPIOA 映射到 0x000~0x01F,例 GPIO0 表示 GPIOA0。
GPIOB 映射到 0x020~0x03F,例 GPIO32 表示 GPIOB0。
GPIOC 映射到 0x040~0x05F,例 GPIO64 表示 GPIOC0。
GPIOD 映射到 0x060~0x07F,例 GPIO96 表示 GPIOD0。
GPIOE 映射到 0x080~0x09F,例 GPIO128 表示 GPIOE0。
GPIOF 映射到 0x0A0~0x0BF,例 GPIO160 表示 GPIOF0。
GPIOG 映射到 0x0C0~0x0DF,例 GPIO192 表示 GPIOG0。
GPIOH 映射到 0x0E0~0x0FF,例 GPIO224 表示 GPIOH0。
GPIOI 映射到 0x100~0x11F,例 GPIO256 表示 GPIOI0。
GPIOJ 映射到 0x120~0x13F,例 GPIO288 表示 GPIOJ0。
//led
echo 231 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio231/direction
echo 1 > /sys/class/gpio/gpio231/value
//INT
echo 42 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio42/direction
cat /sys/class/gpio/gpio42/value
echo 258 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio258/direction
cat /sys/class/gpio/gpio258/value
中断:
先将GPIO配置为输入,然后使用poll()来阻塞程序直到GPIO的输入电平发生改变,关键是使用POLLPRI而不是POLLIN来侦听事件;或者使用select()。
poll示例:
memset((void *)xfds, 0, sizeof(xfds));
xfds[0].fd = fd;
xfds[0].events = POLLPRI;
ret = poll(xfds, 1, -1);
if(ret <= 0)
ERREXIT("poll value");
if(xfds[0].revents & POLLPRI)
{
/* get value */
ret = lseek(fd, 0, SEEK_SET);
if(ret < 0)
ERREXIT("lseek value");
ret = read(fd, buf, 2);
buf[1] = '\0';
printf("read ret = %d, value = %s\n", ret, buf);
if(ret != 2)
ERREXIT("read value");
}
select示例:
FD_ZERO(&exceptfds);
FD_SET(fd, &exceptfds);
ret = select(fd+1,NULL,NULL,&exceptfds,NULL);
if(ret < 0)
ERREXIT("select value");
//else if(ret > 0)
if(ret > 0)
{
/* get value */
ret = lseek(fd, 0, SEEK_SET);
if(ret < 0)
ERREXIT("lseek value");
ret = read(fd, buf, 2);
buf[1] = '\0';
printf("read ret = %d, value = %x\n", ret, buf[0]);
if(ret != 2)
ERREXIT("read value");
}
SPI cs软件控制(PB12)
解决方法
修改pinctrl-nuc970.c,如SPI做主机用,可屏蔽spi从机CS脚
//static const unsigned spi1_0_pins[] = {0x1C, 0x1D, 0x1E, 0x1F};
static const unsigned spi1_0_pins[] = {0x1D, 0x1E, 0x1F};
SSH:
rcS加入
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts
dropbear -p 2222 -F -E (DEBUG)
dropbear -p 2222
普通用户登录时,提示没有no pty was allocated,could not execute
6、建立/dev/pts目录
7、重新挂载devpts (使用mount -a 命令;前提在/etc/fstab有该条记录)
应用程序:
连网后自动获取IP。
配置WIFI后自动联网获取IP
检测TF卡内是否有配置信息(有则复制)及驱动(加载) ,内核升级文件
(1)flash_eraseall /dev/mtd2
(2)flashcp /tmp/rootfs.cramfs /dev/mtd2
ssh 内网穿透
httpd
TCP client 校时
统计信息
不配置内核Disable watchdog shutdown on close时,当wdt_demo运行结束退出后,linux系统会关闭wdt。
看门狗无法复位的问题:
echo V >/dev/watchdog 关闭看门狗
硬件电路上没有32.768KHZ的晶振,然而内核中看门狗用的却是这个32.768KHZ晶振提供的时钟源。
解决方案两种:
第一种:硬件电路上加上这个32.768KHZ的晶振。
第二种:软件上,在内核驱动中,读改写了看门狗的时钟来源的寄存器,将其设置为了从PCLK/4096来的时钟源,也就是75MHZ/4096。
在 driver/watchdog/nuc970_wdt.c 中
将:
static int nuc970wdt_start(structwatchdog_device *wdd)
{
unsignedint val = 0;
val|= (WTRE | WTE | WTR);
if(wdd->timeout< 2) {
val|= 0x5 << 8;
}else if (wdd->timeout < 8) {
val|= 0x6 << 8;
}else {
val|= 0x7 << 8;
}
Unlock_RegWriteProtect();
__raw_writel(val,REG_WDT_CR);
Lock_RegWriteProtect();
return0;
}
修改为:
static int nuc970wdt_start(structwatchdog_device *wdd)
{
unsignedint val = 0;
val|= (WTRE | WTE | WTR);
if(wdd->timeout< 2) {
val|= 0x5 << 8;
}else if (wdd->timeout < 8) {
val|= 0x6 << 8;
}else {
val|= 0x7 << 8;
}
// printk(KERN_INFO"/****************************WDT_START val = 0x%x ************\n", val);//0x783 //why
Unlock_RegWriteProtect();
__raw_writel(val,REG_WDT_CR);
__raw_writel((__raw_readl(REG_CLK_DIV8)& (~0x300)) | 0x200, REG_CLK_DIV8); //why PCLK/4096 //设置看门狗的时钟源
Lock_RegWriteProtect();
return0;
}
将:
static int nuc970wdt_probe(structplatform_device *pdev)函数中的
nuc970_wdd.timeout= 2; // default time out =2 sec (2.03)
nuc970_wdd.min_timeout= 1;
nuc970_wdd.max_timeout= 9; // max time out = 9 sec (8.03)
修改成:
//nuc970_wdd.timeout = 2; // default time out = 2 sec (2.03)
nuc970_wdd.timeout= 8; //why
nuc970_wdd.min_timeout= 1; // min time out = 1 sec (0.53)
//nuc970_wdd.max_timeout= 9; // max time out = 9 sec (8.03)
nuc970_wdd.max_timeout= 14; //why
renice命令。renice -n 2 -p 3432。-n,后面是优先级的值;-p,是进程号
时间:
# 只是-p参数会自动设置为守护进程在后台自动获取ntp时间
busybox ntpd -p cn.pool.ntp.org -qNn (-qNn 前台调试)
web:
php -S 0.0.0.0:8888 -t /www &
优化
Uboot
flash CS时序优化
版本Flash文件系统从JFFS2切换到UBIFS
UBIFS/MTD优化
UBOOT 配置裁剪
串口打印优化
bootdelay优化
设备初始化时序优化
设备驱动优化
Kernel
内核配置裁剪
版本Flash文件系统从JFFS2切换到UBIFS
Initrd
根文件系统文件裁剪
压缩方式从gzip改为LZMA
rcS优化
BSP
设备初始化时序优化
Delay Device Init,从内核态转为由应用程序根据需要来并行设备初始化
在uboot shell或者cmdline中中设置Linux Kernel打印级别
针对linux Kernel,还可以配置CONFIG_PRINTK_TIME=y使能内核的日志时间戳功能
上一篇:TODO
下一篇:Air720模块Linux USB驱动以及PPP拨号说明