P0-P7ピンの電圧レベルが変化すると、INTピンPCA9555PW割り込みが発生します。このドライバ(SoC上で動作する)は、I2C(SCL / SDAピン)を介してP0-P7ピンのステータスを読み取り、P0-P7ピンごとに個別の割り込みを生成できます。これが、このドライバーが割り込みコントローラーとして機能する理由です。
次の構成について考えてみます。
1つのプッシュボタンでP4ピンのレベルが変わり、PCA9555PW割り込みが発生しやすくなります。PCA9555PWからの割り込みはGPIO5のIPコア(SoC内部)に接続され、そのGPIO5モジュールの#9行目を使用してCPUに割り込みを通知します。したがって、PCA9555PWはGPIO5コントローラーにカスケード接続されていると言えます。GPIO5は割り込みコントローラーとしても機能し、GIC割り込みコントローラーにカスケード接続されています。
プロパティの意味は次のとおりです。
interrupt-controllerプロパティは、デバイスが割り込みを生成することを定義します。このノードを各プッシュボタンノードのinterrupt-parentとして使用するには、さらに必要になります 。
#interrupt-cellsはinterrupts プロパティ のフォーマットを定義します 。この例では2 、 行番号が 1 セル、割り込みタイプが 1 セル という です
interrupt-parent プロパティと interrupts プロパティは、割り込みライン接続を説明しています
CPU は、GIC 割り込みハンドラの割り込みコンテキストになりました。gic_handle_irq()から handle_domain_irq()を呼び 、 を呼びgeneric_handle_irq()を呼び出します。詳細は Documentation/gpio/driver.txt を参照してください。これで、SoCのGPIOコントローラーIRQハンドラーにいます。
SoC の GPIO ドライバーは 、特定のピンごとに設定されるgeneric_handle_irq()to run ハンドラーも呼び出します。たとえば、omap_gpio_irq_handler()でどのように行われるかを参照してください 。これで、IRQハンドラPCA9555PWいます。
PCA9555PW IRQ ハンドラは handle_nested_irq()を呼び出します。
最後に、 gpio_keys_gpio_isr() が呼び出されます。
次の手順では、8M Mini Applications Processor Evaluation Kit (EVKB) を搭載した 8MIC-RPI-MX8 ボードで RGB LED とプッシュ ボタン i.MX イネーブルにできます。LEDドライバーを使用して、デバイスツリーを変更する必要があります。
i.MX Linux カーネル リポジトリを ホーム ディレクトリにクローンします。
cd ~
git clone https://source.codeaurora.org/external/imx/linux-imx
このガイドでは、カーネル 5.10.35-2.0 に対応する次のコミットを使用します。
cd linux-imx/git checkout -b RGB ef3f2cfc6010
「0001-Enable-RGB-LED-s-and-push-buttons-on-8MIC-RPI-MX8-bo.patch」をダウンロードします。この投稿に添付されているファイルを作成し、それをlinux-imxディレクトリにコピーしてから、パッチを適用してください。
cp 0001-Enable-RGB-LED-s-and-push-buttons-on-8MIC-RPI-MX8-bo.patch ~/linux-imx/cd ~/linux-imx/patch < 0001-Enable-RGB-LED-s-and-push-buttons-on-8MIC-RPI-MX8-bo.patch
プロンプトが表示されたら、sはパッチを適用するファイルを選択します。
File to patch: arch/arm64/boot/dts/freescale/imx8mm-evk-8mic-revE.dts patching file arch/arm64/boot/dts/freescale/imx8mm-evk-8mic-revE.dts
次に、次のようにツールチェーンを設定します。
source /opt/fsl-imx-wayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux
設定ファイルを生成します。
make imx_v8_defconfig
デバイスツリーをコンパイルします。
make freescale/imx8mm-evk-8mic-revE.dtb
.dtbをコピーしますファイルを EVK に (たとえば scp を使用して) ファイルします。
scp imx8mm-evk-8mic-revE.dtb root@:/home/root
または、.dtbをコピーすることもできますカーネルファイルとデバイスツリーファイルが配置されているFAT32パーティションに直接ファイルします。
leds-pca995x.h を入手します。次のサイトのファイル:
次のパスにコピーします。
cp leds-pca995x.h ~/linux-imx/include/linux
新しいディレクトリを作成します。
mkdir ~/linux-imx/PCA9955
メイクファイルを作成します。
cd ~/linux-imx/PCA9955vim Makefile
KERNEL_ROOT?=~/linux-imx
obj-m += leds-pca995x.o
all: make -C $(KERNEL_ROOT) M=$(PWD) modules
clean: make -C $(KERNEL_ROOT) M=$(PWD) clean
「Esc」キーを押してから、次の操作を行います。
:wq
leds-pca995x.cを入手します。次のサイトのファイル:
次のパスにコピーします。
cp leds-pca995x.c ~/linux-imx/PCA9955
0001-PCA9955BTW.patch ファイルを取得し、次のパスにコピーします。
cp 0001-PCA9955BTW.patch ~/linux-imx/PCA9955
パッチを適用します。
patch < 0001-PCA9955BTW.patch
次に、次のようにツールチェーンを設定します。
source /opt/fsl-imx-wayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux
.ko を生成するファイル。
cd ~/linux-imx/PCA9955make all
.ko をコピーします。ファイルを EVK に (たとえば scp を使用して) ファイルします。
scp leds-pca995x.ko root@192.168.100.105:/home/root
注:Linuxバージョンの.koファイルは EVK と同じである必要があります。
更新されたデバイスツリーを対応するパーティションにコピーするには、まずディレクトリを作成します。
mkdir Partition_1
パーティションを1つマウントします。
mount /dev/mmcblk1p1 Partition_1/
デバイスツリーをパーティション1にコピーまたは移動します。
cp imx8mm-evk-8mic-revE.dtb Partition_1/
ボードを再起動します。
reboot
u-boot で停止し、.dtb を変更します。8micボードのデバイスツリーを使用するためのファイル。
u-boot=> editenv fdtfile
edit: imx8mm-evk-8mic-revE.dtb
u-boot=> saveenv
Saving Environment to MMC... Writing to MMC(1)... OK
u-boot=> boot
次のコマンドを実行して 、ledドライバーをカーネルにロードします。
insmod leds-pca995x.ko
そして、次のようなものが表示されます。
[ 249.359103] leds_pca995x: loading out-of-tree module taints kernel.
[ 249.366864] ALL
[ 249.368740] ALL 0
[ 249.370667] ALL 1
[ 249.372609] ALL 2
[ 249.374536] ALL 2
[ 249.376475] ALL 2
[ 249.378401] ALL 2
[ 249.380338] ALL 2
[ 249.382264] ALL 2
[ 249.384202] ALL 2
[ 249.386127] ALL 2
[ 249.388063] ALL 2
[ 249.389989] ALL 2
[ 249.391913] ALL 2
[ 249.393847] ALL 2
[ 249.395774] ALL 2
[ 249.397709] ALL 2
[ 249.399635] ALL 2
[ 249.401568] ALL 2
[ 249.403496] ALL 3
デバイスツリーを変更した場合は、次のコマンドでLEDを点灯できます。
echo 250 > /sys/class/leds/pca995x\:blue0/brightness
LED をオフにするには:
echo 0 > /sys/class/leds/pca995x\:blue0/brightness
赤、青、緑のLEDは、提供されるさまざまな強度で点灯できます。
デバイスツリーを変更した場合は、次のコマンドでプッシュボタンをテストできます。
evtest
正しい番号を選択します。
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: 30370000.snvs:snvs-powerkey
/dev/input/event1: sw_keys
/dev/input/event2: gpio_ir_recv
Select the device event number [0-2]: 1
そして、あなたは見るでしょう:
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "sw_keys"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 67 (KEY_F9)
Event code 113 (KEY_MUTE)
Event code 114 (KEY_VOLUMEDOWN)
Event code 115 (KEY_VOLUMEUP)
Properties:
Testing ... (interrupt to exit)
Event: time 1642457988.1642457988, type 1 (EV_KEY), code 114 (KEY_VOLUMEDOWN), value 1
Event: time 1642457988.1642457988, -------------- SYN_REPORT ------------ Event: time 1642457988.1642457988, type 1 (EV_KEY), code 114 (KEY_VOLUMEDOWN), value 0
Event: time 1642457988.1642457988, -------------- SYN_REPORT ------------