Drone CI编译kernel出现multiple target patterns错误

使用Drone 0.7版本的构建Linux代码时,出现以下错误:

make distclean
Makefile:114: *** multiple target patterns.  Stop.

测试查找原因后,才知道是由于目录层级太深出现的错误。向Drone的社群询问后,得知可以使用Drone的workspace功能来解决问题。workspace就是定义repo的工作目录。这是可以指定新的路径,这样就可以编译Linux代码了。

workspace:
    path: /dronebuild

这样写了后,在container中运行的路行就是/drone/dronebuild目录了。

Drone CI 0.7版本使用docker-compose搭建问题

新版本的Drone CI分离成两个服务,drone和agent。agent依赖于drone。根据手册建议,新版使用docker-compose部署更加文便,但我的一直提示异常。

drone-agent_1   | rpc: error re-connecting: websocket: bad handshake
drone-server_1  | Unable to connect agent. Invalid authorization token "Bearer" does not match ""

细看文档之后才明白是DRONE_SECRET变量设置有问题,这个在drone和agent中要设置成一样的,两个服务才互相连接。然后使用docker-compose启用就可以访问了。

docker-compose -f drone-docker.yml -d up

下面是drone-docker.ymk文件的内容,供参考:

version: '2'

services:
    drone-server:
        image: drone/drone:latest
        ports:
            - 8000:8000
        volumes:
            - /var/lib/drone:/var/lib/drone/
        restart: always
        environment:
            - DRONE_OPEN=true
            - DRONE_HOST=http://192.168.2.12:8000
            - DRONE_GOGS=true
            - DRONE_GOGS_URL=http://192.168.2.12:3000
            - DRONE_SECRET="123456"
            - DRONE_GOGS_SKIP_VERIFY=true

    drone-agent:
        image: drone/drone:latest
        command: agent
        restart: always
        depends_on:
            - drone-server
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            - DRONE_SERVER=ws://drone-server:8000/ws/broker
            - DRONE_SECRET="123456"
            - DOCKER_API_VERSION=1.22

ATMEL SAMA5D36的Flash分区结构

这块板使用Linux 3.6.9版本,使用了dts方式初始化bsp设备,但很多驱动上并没有对dts全整支持。Nand上的分区信息也只是靠U-Boot来传输,dts并没有配置。当前的分区信息如下:

Bootstrap: 0x00000000 ~ 0x40000, size = 256KB
U-Boot: 0x40000 ~ 0xC0000, size = 512KB
U-Boot Env: 0xC0000 ~ 0x180000, size = 768KB
DTB file: 0x180000 ~ 0x200000, size = 128KB
Kernel: 0x200000 ~ 0x800000, size = 6MB
rootfs: 0x800000 ~ 0x10000000, size = 256 - 8 = 248MB

要修改分区信息的话,Bootstrap,U-Boot的Loadaddr相关的都要修改,U-Boot传递给Kernel的mtd信息也要修改。实际上主发还是在U-Boot上,Bootstrap只需要知道U-Boot的地址就可以,Load后跳转就交给U-Boot。SAMA5D3系列的芯片使用了SAM-BA工具来提供烧写功能。

下面是SAM-BA中对NAND的烧写地址定义:

## NandFlash Mapping
set bootStrapAddr   0x00000000
set ubootAddr       0x00040000
set ubootEnvAddr    0x000c0000
set dtbAddr         0x00180000
set kernelAddr      0x00200000
set rootfsAddr      0x00800000
## u-boot variable
set kernelLoadAddr  0x22000000
set dtbLoadAddr     0x21000000 

Gogs和DroneCI 0.7版本配置

之前用Drone 0.4版本,以为直接用就可以了,dock run之后一直提示错误,翻了Drone的文档才知道配置是有区别的。这里以Gogs的地址为192.168.2.12:3000,Drone的地址为192.168.2.12:8000为例。

启动drone容器:

docker run --volume /var/lib/drone:/var/lib/drone -i -t \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --restart=always \
    --publish=8000:8000 \
    --env-file dronerc \
    --detach \
    --name=droneci drone/drone:latest

dronerc文件的内容:

DRONE_OPEN=true
DRONE_HOST=${DRONE_HOST}
DRONE_GOGS=true
DRONE_GOGS_URL=http://192.168.2.12:3000
DRONE_SECRET=${DRONE_SECRET}

使用Gogs和Drone也有一年半了,对于嵌入式开发来说,Drone更多被我用来制做镜像包分发给客户,算是减少了一部分重复的人工工作量,其他同事也可以参与任何一个项目的分发环节。也由于硬件的绑定,不能让Drone参与到硬件上的软件测试工作中。最近有了解一些jenkins应用到硬件的文章,希望以后嵌入式开发也可以享受到更便捷的开发方式和工具。

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

i.MX6UL应用web服务器Monkey

以前刚学嵌入式的时候,在micro2440上移植过GoAhead,不过介于cpu和内存,只是简单的显示静态网页。i.MX6UL和i.MX6ULL的核心要比2440好很多了,运行web server也更容易了。

Monkey是一个高性能的开源Web服务端软件。它被设计于更易扩展和低内存消耗。支持ARM, x86和x64平台。

下面以i.MX6UL为例,使用前需要先编译并部署在开发板上,本文使用Yocto的方式,构建并安装在最终镜像内,生成的镜像方便向更多设备部署。

构建

基于Yocto构建就比较方便了,同时Monkey也提供Yocto的bb文件。"bitbake monkey"只是编译了Monkey,并没有安装到镜像包内。需要修改core-image-base.bbappend文件加入到"IMAGE_INSTALL"变量即可。

git clone https://github.com/monkey/monkey-yocto
cp -r monkey-yocto/monkey fsl-release-yocto/sources/poky/meta/recipes-extended/
cd fsl-release-yocto
source setup-environment build
bitbake monkey
vi ../sources/meta-myir-imx6ulx/recipes-core/images/core-image-base.bbappend
bitbake core-image-base

运行时截图

Monkey默认是绑定0.0.0.0:2001地址,所以配置好IP地址就可以访问了。HTML默认存储在/var/www/monkey目录,站点配置在/etc/monkey/sites/default文件中。

mys6ulx-Monkey.png

Reference

Monkey Document
Monkey Official Website

macOS终端复制粘贴格式

macOS上从终端复制选中文本后,再粘贴到其它应用中会出现黑色背景,是原因默认是带format格式的。可以使用"cmd + shift + v"只粘贴文本内容。

最新文章

最近回复

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

分类

归档

其它