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拨号说明