[Linux]ドライバー-1-環境の準備

目次
  • 序文
  • 1.開発環境のセットアップ
    • 1.1環境への準備
      • 1.1.1インストールツール
      • 1.1.2カーネルをコンパイルする
        • 1.1.2.1カーネルソースコードを取得する
        • 1.1.2.2カーネルをコンパイルする
    • 1.2カーネルドライバモジュールをコンパイルしてロードします
      • 1.2.1helloルーチン分析
      • 1.2.2カーネルソースコードでコンパイルする
      • 1.2.3カーネルドライバモジュールをロードします
    • 1.3デバイスツリーをコンパイルしてロードする
      • 1.3.1デバイスツリーのコンパイル
        • 1.3.1.1カーネルでdtcを使用して、に従ってコンパイルします。
        • 1.3.1.2カーネルソースコードでコンパイルする(推奨)
        • 1.3.1.3デバイスツリーのロード
    • 1.4デバイスツリープラグインをコンパイルしてロードする
      • 1.4.1dtcツールのみでコンパイルする
      • 1.4.2カーネルdtcツールは、デバイスツリープラグインをコンパイルします
      • 1.4.3デバイスツリープラグインをロードする
        • 1.4.3.1エコーコマンドでロード
        • 1.4.3.2ubootの読み込み
  • 参照:


序文

クーポンhttps://www.cps3.cn/
  • 例として山火事iM6Uを取り上げます

1.開発環境のセットアップ

ドライブの動作条件

  • デバイスドライバは、独立した機能を持つプログラムであり、個別にコンパイルすることはできますが、独立して実行することはできません。カーネルにリンクされ、実行時にカーネルの一部としてカーネル空間で実行されます。
  • したがって、作成したカーネルモジュールを特定のバージョンのカーネルで実行する場合は、そのカーネルバージョンでコンパイルする必要があります。コンパイルしたカーネルと実行しているカーネルの特性が異なる場合、デバイスドライバーはそうではない可能性があります。実行できる。

ドライバーの簡単なコンパイル手順

  • まず、カーネルのバージョンを知り、このバージョンのカーネルソースコードを準備し、クロスコンパイルツールを使用してカーネルソースコードをコンパイルする必要があります。
  • 次に、コンパイルされたカーネルソースコードを使用して、ドライバーモジュールとデバイスツリーファイルをコンパイルします。
  • 最後に、ドライブモジュールとデバイスツリーを開発ボードにコピーして実行します。

1.1環境への準備

1.1.1インストールツール

ソースコードをコンパイルする前に、クロスコンパイル環境を準備し、次のような必要な依存関係とツールをインストールする必要があります。

  • gcc-arm-linux-gnueabihfクロスコンパイラ
  • バイソンパーサー
  • フレックス字句解析プログラム
  • libssl-devOpenSSL一般ライブラリ
  • lzopLZO圧縮ライブラリ用の圧縮ソフトウェア

参照コマンド:

  • sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop

1.1.2カーネルをコンパイルする

カーネルのコンパイルには、次の2つの目的があります。

  • システムイメージを作成し、開発ボードに書き込みます
  • ドライバー開発を支援するために、開発環境のシステムにコピーを保管してください
1.1.2.1カーネルソースコードを取得する

カーネルが開発ボードにプログラムされている場合はuname -a、カーネルのバージョンを表示するようにコマンド実行できます
*
カーネルのバージョンを知った、公式Webサイトでカーネルのソースコードをダウンロードできます。たとえばバージョンはこの章のLinux npi 4.1.9.71-imx-r1であり、giteeまたはgithub(Wildfireによって公式に提供されています)からダウンロードできます。

  • コマンド:git clone https://gitee.com/Embedfire/ebf-buster-linux.git
1.1.2.2カーネルをコンパイルする

カーネルをコンパイルするプロセスは、さまざまな担当者から提供された手順とMakefileによって異なります。以下は、wildfireのiM6Uコンパイル済みLinuxカーネルの例です。
新しい作業ディレクトリを個別に作成し、そのカーネルソースコードをこのディレクトリに配置し、カーネルソースコードディレクトリに切り替えて、make_deb.shスクリプトを見つけ、カーネルのコンパイル場所など、内部の構成パラメータを変更します。構成パラメーターを変更した後は、スクリプトを実行するだけでカーネルをコンパイルできます。他のカーネルについては、このスクリプトを参照するか、自分でコンパイルスクリプトを作成することができます

deb_distro=bionic
DISTRO=stable
build_opts="-j 6"
build_opts="${build_opts} O=build_image/build"
build_opts="${build_opts} ARCH=arm"
build_opts="${build_opts} KBUILD_DEBARCH=${DEBARCH}"
build_opts="${build_opts} LOCALVERSION=-imx-r1"

build_opts="${build_opts} KDEB_CHANGELOG_DIST=${deb_distro}"
build_opts="${build_opts} KDEB_PKGVERSION=1${DISTRO}"
build_opts="${build_opts} CROSS_COMPILE=arm-linux-gnueabihf-"
build_opts="${build_opts} KDEB_SOURCENAME=linux-upstream"

make ${build_opts}  npi_v7_defconfig
make ${build_opts}
make ${build_opts}  bindeb-pkg
  • O=build_image/build:コンパイルされたカーネルの場所を指定します。
  • ARCH=arm:ターゲットはARMアーキテクチャコアです。
  • KBUILD_DEBARCH=${DEBARCH}:deb-pkgターゲットの場合、deb-pkgデプロイメントの従来のヒューリスティックをオーバーライドできます。
  • LOCALVERSION=-imx-r1:カーネル構成オプション「LOCALVERSION」を使用して、通常のカーネルバージョンに一意のサフィックスを追加します。
  • KDEB_CHANGELOG_DIST=${deb_distro}
  • KDEB_PKGVERSION=1${DISTRO}:バージョン情報。
  • CROSS_COMPILE=arm-linux-gnueabihf-:クロスコンパイラを指定します。
  • KDEB_SOURCENAME=linux-upstream:KDEB_SOURCENAME make変数は、パッケージ化されたソースtarballの名前のみを制御し、bind-pkgおよびdeb-pkgによって出力される.debパッケージ名には影響しません。
  • make ${build_opts} npi_v7_defconfig:構成ファイルを生成します。
  • make ${build_opts} bindeb-pkg:パッケージ化のためにファイルをコンパイルします。

1.2カーネルドライバモジュールをコンパイルしてロードします

helloルーチンはLiZhumingのgiteeクローンに移動できます:demo_code_for_mystudy / linux / driverTest / helloModule

1.2.1helloルーチン分析

これは単なるモジュールルーチンであり、ドライバ部分
はありません必要なコンテンツは、次のポイントに分けることができます。

  • エントリー機能
  • エクスポート機能
  • プロトコル

hello_module.c

/** @file hello_module.c
* @brief 简要说明
* @details 详细说明
* @author lzm
* @date 2021-02-21 18:08:07
* @version v1.0
* @copyright Copyright By lizhuming, All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
// 入口函数:安装驱动时调用的函数
static int __init hello_init(void)
{
printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init
");
printk( "[ default ] Hello Module Init
");
return 0;
}
// 出口函数:卸载驱动时调用的函数
static void __exit hello_exit(void)
{
printk("[ default ] Hello Module Exit
");
}
module_init(hello_init);
module_exit(hello_exit);
//MODULE_LICENSE("GPL2");
MODULE_AUTHOR("embedfire ");
MODULE_DESCRIPTION("hello world module");
MODULE_ALIAS("test_module");

1.2.2カーネルソースコードでコンパイルする

1.2.3カーネルドライバモジュールをロードします

コンパイルされたカーネルドライバモジュールxx.koは、NFSネットワークファイルシステムやSCPコマンドなど、さまざまな方法でARMボードにコピーできます。
取り付け方法については、LiZhumingのブログパークのNFSの章を参照してください。

1.3デバイスツリーをコンパイルしてロードする

デバイスツリーは、ハードウェアプラットフォームのボードレベルの詳細を説明するためにLinux3.xで導入されました。
この一連のメモのドライバルーチンは、特に指定されていない限り、デバイスツリーに依存しています
以下に、デバイスツリーのコンパイルとロードについて簡単に説明します。特定の原則については、特定の章で説明します。

1.3.1デバイスツリーのコンパイル

1.3.1.1カーネルでdtcを使用して、に従ってコンパイルします。

コンパイルされたカーネルは、dtcツールを自動的に生成しますパスは、kernel / scripts / dtc / dtcです。
コンパイルコマンド:内核构建目录/scripts/dtc/dtc -I dts -O dtb -o xxx.dtbo xxx.dts

  • dtsをdtbにコンパイルする手段
1.3.1.2カーネルソースコードでコンパイルする(推奨)

カーネルをコンパイルすると、デバイスツリーが自動的にコンパイルされます。今回は、デバイスツリーをソースファイルの所定の位置に配置するだけで、デバイスツリーソースファイル、デバイスファイルツリーがコンパイルされ、デバイスツリーファイルがカーネルソースに保存されます。 / arch / arm / boot / dtsただし、カーネルのコンパイルには時間がかかるため、デバイスツリーのみをコンパイルすることをお勧めします。方法は次のとおりです。

  • 両方のコマンドは、カーネルソースコードのトップレベルパスの下で実行されます(実際には、トップレベルのMakefileを使用します)。
    • カーネルソースコードmakedistcleanを実行する場合は、最初のコマンドを実行してデフォルトの構成ファイルを生成する必要があります。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs
1.3.1.3デバイスツリーのロード

デバイスツリーを置き換える方法:

  • 最初のタイプ:デバイスツリーはカーネルにコンパイルされるため、カーネルを再コンパイルしてミラーイメージを再作成します。(面倒、お勧めしません)
  • 2番目のタイプ:コンパイルされたデバイスツリーまたはデバイスツリープラグインを開発ボード上のプラグインに置き換えます。(推奨)
  • 3番目のタイプ:コンパイルされたデバイスツリーを開発ボード** / boot / dtbs / xxx /に配置し、ブート起動パラメーターを変更します。(推奨)

ロードが成功したかどうかを確認します。

  • / proc / device-treeディレクトリに移動して、ロードされたデバイスノードを表示し、変更があるかどうかを確認します。

1.4デバイスツリープラグインをコンパイルしてロードする

Linux4.4以降、動的デバイスツリーが導入され、カーネルが認識できるようにデバイスツリープラグインがシステムに動的にロードされました。
デバイスツリープラグインは通常、ハードウェア情報の一部を変更および追加するために使用されます。あなたが唯一のRGBランプのハードウェア情報を追加する場合は、あなただけコンパイルする必要があり.dtsののファイルRGBランプをとして.dtbo
デバイスツリープラグインをコンパイルする場合、デバイスツリープラグイン全体を再コンパイルする必要はなく、変更された部分のみを再コンパイルする必要があります。

1.4.1dtcツールのみでコンパイルする

デバイスツリーとデバイスツリープラグインはどちらも、DTCコンパイルツールを使用してコンパイルされます。
デバイスツリーがコンパイルされた後、.dtbファイル取得されます。
デバイスツリープラグインがコンパイルされて、.dtboファイルが取得されます。
Wildfireが提供するワンクリックコンパイルツールを使用します。

  • アドレス:git clone https://gitee.com/Embedfire/ebf-linux-dtoverlays.git
  • コンパイルするデバイスツリープラグインのソースファイルはebf-linux-dtoverlays / overlays / ebfディレクトリに配置され、コンパイルツールebf-linux-dtoverlays /のルートディレクトリに戻って「make」を実行します。
  • 生成された.dtboは、〜/ ebf-linux-dtoverlays / outputディレクトリにあります。
  • 「make」の実行後にエラーが発生した場合は、最初にdevice-tree-compilerをアンインストールして(アンインストールコマンドは「sudoapt-get autoremove device-tree-compiler」)、再インストールして、次に、ebf-linux-dtoverlays / basic / fixdepファイルのアクセス許可をクリックし、アクセス許可コマンド「chmod777scripts / basic / fixdep」を変更します。

1.4.2カーネルdtcツールは、デバイスツリープラグインをコンパイルします

デバイスツリープラグインのコンパイルは、デバイスツリーのコンパイルと似ています。ここでは、カーネルのdtcツールを使用して、デバイスツリープラグインをコンパイルおよびコンパイルします。
コンパイルコマンド:内核构建目录/scripts/dtc/dtc -I dts -O dtb -o xxx.dtbo xxx.dts

  • dtsをdtboにコンパイルする手段

1.4.3デバイスツリープラグインをロードする

まず、デバイスツリープラグインファイルを開発ボードにコピーします。

1.4.3.1エコーコマンドでロード

まず、/ sys / kernel / config / device-tree / overlays /の下にカスタム名で新しいディレクトリを作成します
その後dtboファームウェアエコーへのパスプロパティファイルまたはdtboコンテンツdtboプロパティファイル。

echo xxx.dtbo >/sys/kernel/config/device-tree/overlays/xxx/path
# 或
cat xxx.dtbo >/sys/kernel/config/device-tree/overlays/xxx/dtbo

デバイスrmdir /sys/kernel/config/device-tree/overlays/xxxます:プラグインを

1.4.3.2ubootの読み込み

異なるボードはそれをサポートしないかもしれません。
環境変数ファイルを変更し、/ bootディレクトリに入り、vimuEnv.txtを変更するだけです。

参照:

  • LiZhumingブログパーク
  • ワイルドファイア

おすすめ

転載: blog.csdn.net/weixin_48967543/article/details/114928988