はじめに

近年の組込み機器はOSにLinuxを使用していることが増えてきました。
また、Yoctoを使い必要なモジュールを取捨選択して環境を構築しているプロジェクトも多々あります。
開発を進めていくなかで、DTシリーズを使ってテストをしたり、デバッグをしたくなることがありますよね。
ですが、その都度ドライバを含めてOSビルドして…と、時間がかかってしまいます。また、派生機種や後継機種の開発でも流用できたら効率的な開発ができると思いませんか?
そこでDTシリーズを使う上で必要なドライバファイルを、共有ライブラリ化してインストールして使えるようにするYoctoレシピを作成してみます。

ライブラリを作ってみる

さっそくですが、DTシリーズのドライバファイルをライブラリ化してみます。
なお、Raspberry Pi 4のOSビルドのための環境構築につきましては、本ページ下部に参考文献を記載しておりますので割愛させていただきます。
今回は以下の構成になるように環境を作成しました。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/path/to/workdir/rpi-zeus/layers/meta-dtdrv$ tree
|-- COPYING.MIT
|-- README
|-- conf
| `-- layer.conf
`-- recipes-dtdrv
`-- dtdriver
|-- include
| `-- libDTDataWitingDrv.h #ライブラリを使用するためのヘッダファイル
|-- libdtdrv
| |-- Makefile
| `-- dt_datawriting_drv.c #ドライバファイル
|-- libdtdrv_1.0.bb     #ドライバファイルをビルドするためのレシピ
|-- sortsample
| |-- DT_testsort.h
| |-- Makefile
| `-- testsort.c    #サンプルアプリ(テストポイント挿入済み)
`-- sortsample_1.0.bb  #サンプルアプリをビルドするためのレシピ
/path/to/workdir/rpi-zeus/layers/meta-dtdrv$ tree |-- COPYING.MIT |-- README |-- conf | `-- layer.conf `-- recipes-dtdrv `-- dtdriver |-- include | `-- libDTDataWitingDrv.h #ライブラリを使用するためのヘッダファイル |-- libdtdrv | |-- Makefile | `-- dt_datawriting_drv.c #ドライバファイル |-- libdtdrv_1.0.bb     #ドライバファイルをビルドするためのレシピ |-- sortsample | |-- DT_testsort.h | |-- Makefile | `-- testsort.c    #サンプルアプリ(テストポイント挿入済み) `-- sortsample_1.0.bb  #サンプルアプリをビルドするためのレシピ
/path/to/workdir/rpi-zeus/layers/meta-dtdrv$ tree
|-- COPYING.MIT
|-- README
|-- conf
|   `-- layer.conf
`-- recipes-dtdrv
    `-- dtdriver
        |-- include
        |   `-- libDTDataWitingDrv.h   #ライブラリを使用するためのヘッダファイル
        |-- libdtdrv
        |   |-- Makefile
        |   `-- dt_datawriting_drv.c  #ドライバファイル
        |-- libdtdrv_1.0.bb     #ドライバファイルをビルドするためのレシピ
        |-- sortsample
        |   |-- DT_testsort.h
        |   |-- Makefile
        |   `-- testsort.c    #サンプルアプリ(テストポイント挿入済み)
        `-- sortsample_1.0.bb  #サンプルアプリをビルドするためのレシピ

作成したライブラリ用のレシピ(libdtdrv_1.0.bb)は以下の通りです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SUMMARY = "DT driver library"
SECTION = "libs"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
PACKAGES = "${PN}"
PROVIDES = "${PN}"
FILES_${PN} += "${libdir}/libdtdrv.so"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
SRC_URI = "file://."
S = "${WORKDIR}"
TARGET_CC_ARCH += "${LDFLAGS}"
do_compile() {
echo "WORKDIR:${WORKDIR}" >> ~/build.log
echo "D:${D}" >> ~/build.log
echo "S:${S}" >> ~/build.log
oe_runmake
}
do_install() {
install -d ${D}${libdir}
install -m 0755 libdtdrv.so ${D}${libdir}
}
SUMMARY = "DT driver library" SECTION = "libs" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PACKAGES = "${PN}" PROVIDES = "${PN}" FILES_${PN} += "${libdir}/libdtdrv.so" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" SRC_URI = "file://." S = "${WORKDIR}" TARGET_CC_ARCH += "${LDFLAGS}" do_compile() { echo "WORKDIR:${WORKDIR}" >> ~/build.log echo "D:${D}" >> ~/build.log echo "S:${S}" >> ~/build.log oe_runmake } do_install() { install -d ${D}${libdir} install -m 0755 libdtdrv.so ${D}${libdir} }
SUMMARY = "DT driver library"
SECTION = "libs"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

PACKAGES = "${PN}"
PROVIDES = "${PN}"

FILES_${PN} += "${libdir}/libdtdrv.so"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"

SRC_URI = "file://."
S = "${WORKDIR}"
TARGET_CC_ARCH += "${LDFLAGS}"

do_compile() {
        echo "WORKDIR:${WORKDIR}" >> ~/build.log
        echo "D:${D}" >> ~/build.log
        echo "S:${S}" >> ~/build.log
        oe_runmake
}

do_install() {
             install -d ${D}${libdir}
             install -m 0755 libdtdrv.so ${D}${libdir}
}

ライブラリのMakefileは以下の通りです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#
# Makefile for dt_datawriting_drv.so
# Copyright 2021 Heartland.Data Inc.
#
TARGET = libdtdrv.so
SRCS := dt_datawriting_drv.c
all:
${CC} ${SRCS} -shared -pthread -fPIC -o ${TARGET}
install:
sudo cp ${TARGET} /usr/lib;
sudo ldconfig;
clean:
rm -f *.so *.o
# # Makefile for dt_datawriting_drv.so # Copyright 2021 Heartland.Data Inc. # TARGET = libdtdrv.so SRCS := dt_datawriting_drv.c all: ${CC} ${SRCS} -shared -pthread -fPIC -o ${TARGET} install: sudo cp ${TARGET} /usr/lib; sudo ldconfig; clean: rm -f *.so *.o
#
# Makefile for dt_datawriting_drv.so
# Copyright 2021 Heartland.Data Inc.
#

TARGET = libdtdrv.so
SRCS := dt_datawriting_drv.c

all:
    ${CC} ${SRCS} -shared -pthread -fPIC -o ${TARGET}

install:
    sudo cp ${TARGET} /usr/lib;
    sudo ldconfig;

clean:
    rm -f *.so *.o

ライブラリを使うためのヘッダファイル(libDTDataWritingDrv.h)は以下の通りです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/*============================================================================*/
/* Copyright (C) 2009-2021, Heartland Data inc. All Rights Reserved. */
/* */
/* Title : Data Writing Driver */
/* Author : HLDC */
/*============================================================================*/
#ifndef _LIBDTDATAWRITINGDRV_H_
#define _LIBDTDATAWRITINGDRV_H_
#define DT_UINT unsigned int
extern void _TP_BusOut(DT_UINT addr, DT_UINT dat);
extern void _TP_MemoryOutput(DT_UINT addr, DT_UINT dat, void *value, DT_UINT size);
#endif // _LIBDTDATAWRITINGDRV_H_
/*============================================================================*/ /* Copyright (C) 2009-2021, Heartland Data inc. All Rights Reserved. */ /* */ /* Title : Data Writing Driver */ /* Author : HLDC */ /*============================================================================*/ #ifndef _LIBDTDATAWRITINGDRV_H_ #define _LIBDTDATAWRITINGDRV_H_ #define DT_UINT unsigned int extern void _TP_BusOut(DT_UINT addr, DT_UINT dat); extern void _TP_MemoryOutput(DT_UINT addr, DT_UINT dat, void *value, DT_UINT size); #endif // _LIBDTDATAWRITINGDRV_H_
/*============================================================================*/
/*  Copyright (C) 2009-2021, Heartland Data inc. All Rights Reserved.         */
/*                                                                            */
/*  Title  :   Data Writing Driver                                            */
/*  Author :   HLDC                                                           */
/*============================================================================*/
#ifndef _LIBDTDATAWRITINGDRV_H_
#define _LIBDTDATAWRITINGDRV_H_

#define  DT_UINT unsigned int

extern void _TP_BusOut(DT_UINT addr, DT_UINT dat);
extern void _TP_MemoryOutput(DT_UINT addr, DT_UINT dat, void *value, DT_UINT size);

#endif  // _LIBDTDATAWRITINGDRV_H_

このファイルを、テストポイントを挿入するファイルでincludeするようにしてください。

ビルドしてみる

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/path/to/workdir/rpi-zeus/build$ bitbake core-image-base
/path/to/workdir/rpi-zeus/build$ bitbake core-image-base
/path/to/workdir/rpi-zeus/build$ bitbake core-image-base

ビルドができたらmicroSDカードに書き込んでRaspberry Pi 4を起動させてみましょう。

動かしてみよう!

シリアルを有効にしていたのでTeraTermからログインしてみます。

TeraTermからログイン

無事に作成したライブラリが/usr/lib/libdtdrv.soとしてインストールされていました!
続いてテストポイント挿入済みのサンプルアプリを実行するとConvert.DATができますので、DT+で読み込んでみましょう。

YoctoProject_DT+で解析

ログも無事に取得でき、DT+で解析することができました!

まとめ

作成した共有ライブラリはサイズが小さく、資源に制約のある組込み機器であってもインストールしておいて問題ないです。
また今回はファイル書き出し用のドライバを選びましたが、複数の形式を取り込んで切り替えたり、ファイル書き出しする先を任意に選ぶなどカスタマイズしてもよいです。(むしろ、より一層幅広い開発でお使いいただけます!)
どんどん活用して効率的な開発やテストを目指しましょう!

<参考文献>
https://mickey-happygolucky.hatenablog.com/entry/2019/12/05/072630
みつきんのメモ – Yocto Project 3.0(Zeus)でラズベリーパイ4を動かす

https://mcommit.hatenadiary.com/entry/2019/12/05/235100
simotin13’s message – yoctoで共有ライブラリ(.so)を作るレシピを書いてみた

動的、継承。DT+シリーズ、新登場。

今までのDTシリーズの機能はそのままに、
パーソナルなデバッグから、テストの自動化、リモートテストまで、
多様な開発スタイルに幅広く対応できる、進化する動的テストツール、
それがDT+。