#author("2021-02-25T02:39:18+00:00","default:admin","admin") #author("2021-11-02T02:10:23+00:00","default:admin","admin") -[[組み込みLinuxデバイスドライバの作り方 (1):https://qiita.com/iwatake2222/items/1fdd2e0faaaa868a2db2]] ... 1回目: ビルド環境準備と、簡単なカーネルモジュールの作成 -[[組み込みLinuxデバイスドライバの作り方 (2):https://qiita.com/iwatake2222/items/580ec7db2e88beeac3de]] ... 2回目: システムコールハンドラとドライバの登録(静的な方法) -[[組み込みLinuxデバイスドライバの作り方 (3):https://qiita.com/iwatake2222/items/6b02494a3668f79800e6]] ... 3回目: システムコールハンドラとドライバの登録(動的な方法) -[[組み込みLinuxデバイスドライバの作り方 (4):https://qiita.com/iwatake2222/items/26d5f7f4894ccc4ce227]] ... 4回目: read/writeの実装とメモリのお話 -[[組み込みLinuxデバイスドライバの作り方 (5):https://qiita.com/iwatake2222/items/cd1d7734c8911830386d]] ... 5回目: ラズパイ用のGPIOデバドラの実装 -[[組み込みLinuxデバイスドライバの作り方 (6):https://qiita.com/iwatake2222/items/ade0a73d4c05fc7961d3]] ... 6回目: ioctlの実装 -[[組み込みLinuxデバイスドライバの作り方 (7):https://qiita.com/iwatake2222/items/548444999d2dfdc06f46]] ... 7回目: procfs用インタフェース -[[組み込みLinuxデバイスドライバの作り方 (8):https://qiita.com/iwatake2222/items/1ef4b629f9b9bab4d222]] ... 8回目: debugfs用インタフェース]] -[[組み込みLinuxデバイスドライバの作り方 (9):https://qiita.com/iwatake2222/items/e92a950a2cf57d1a3ded]] ... 9回目: 他のカーネルモジュールの関数を呼ぶ / GPIO制御関数を使う -[[組み込みLinuxデバイスドライバの作り方 (10):https://qiita.com/iwatake2222/items/dbc544864f0e9873270a]] ... 10回目: I2Cを使ったデバイスドライバを作る -[[組み込みLinuxデバイスドライバの作り方 (11):https://qiita.com/iwatake2222/items/0d13142863d9ed064e41]] ... 11回目: デバイスツリーにI2Cデバイスを追加する -[[組み込みLinuxデバイスドライバの作り方 (12)(完):https://qiita.com/iwatake2222/items/b9dd02724e83e36dabc3]] ... 12回目: 作成したデバイスドライバを起動時にロードする -[[はじめて学ぶデバイスドライバ開発。組み込みLinuxによるハードウェア制御の仕組みを学ぶ:https://www.aps-web.jp/academy/wr-linux/23638/]] -[[Linux Kernel Driver Quest:http://www.ftechworks.mydns.jp/wiki/index.php?Introduction]] -[[Linuxデバイスドライバ開発:http://public2016.hatenablog.com/]] -[[キャラクタデバイスドライバを作ってみた。:https://k-onishi.hatenablog.jp/entry/2018/12/01/224150]] *コーディング規約 [#h1ca4da5] -タブ ... 8文字 -インデント ... 8文字 -1行は80文字まで --80文字より長い行は分割して、次の行になるべく右の方に配置 -関数はなるべく短くすべきで、長くても2画面(1画面は80x24)まで *ビルド [#u8bfd566] **Makefile [#c08a6308] obj-m += foobar.o all: make -C /lib/modules/$(shell uname -r)/build M=${PWD} modules clean: make -C /lib/modules/$(shell uname -r)/build M=${PWD} clean -obj-m ... 最終的に作りたい *.ko ファイルのもととなる .o ファイルを指定 - -C オプション ... Makefileがある場所を指定(別アーキテクチャ用の場合は、そのカーネルソースのパスなどを直接指定) **カーネルコンフィグレーションへの追加 [#be7fe215] *コーディング [#kc4d3776] **ヘッダファイルのinclude [#q1ec59d8] #include <linux/module.h> #include <linux/init.h> **ライセンス指定 [#u3a663c5] -*.c に MODULE_LICENSEマクロを記述 -例) MODULE_LICENSE("Dual BSD/GPL"); **printk() [#xf229cff] -printf() は使えない。代わりに pritk() を使う。 -printk() の出力先はカーネルバッファ -カーネルバッファは dmesg コマンドで参照できるが、ラウンドロビン形式なので一定量を超えると古い方から上書きされていく *GPIO制御 [#t10e7f6e] -[[sys/classにgpioが作成されない:https://armadillo.atmark-techno.com/forum/armadillo/1051]] **制御関数 [#r5a8fb65] -linux/gpio.h -int gpio_request(unsigned gpio, const char *label) --GPIOを登録する。gpioはGPIO番号。 -int gpio_export(unsigned gpio, bool direction_may_change); --外部から制御可能な汎用GPIOとして使用できるようにする。 -int gpio_direction_output(unsigned gpio, int value) --GPIOを出力に設定する。gpioはGPIO番号。valueは初期出力値(0 = low, 1 = high) -int gpio_direction_input(unsigned gpio) --GPIOを入力に設定する。gpioはGPIO番号 -void gpio_set_value(unsigned gpio, int value) --GPIOに出力する。gpioはGPIO番号。valueは出力値(0 = low, 1 = high) -int gpio_to_irq(unsigned gpio) --GPIOの指定したピンの割り込み番号を取得する -int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) --割り込みハンドラの登録をする。これはGPIOに限った関数ではありません *I2C [#a8bb2fc0] -[[Raspberry Pi でI2C:C言語プログラミング:http://d.hatena.ne.jp/penkoba/20131222/1387689702]] -[[I2C通信の技術説明とドライバ作成方法:https://www.toppers.jp/docs/ET2016_HD-1_002.pdf]]