ST MP157 中断系统Linux驱动程序设计

184 阅读1分钟

1 硬件设计

image.png

2 设备树设计

2.1 参考文档

image.png image.png

2.2 设备树设计

image.png

image.png

beep {
    compatible = "alientek,beep";
    status = "okay";
    beep-gpio = <&gpioc 7 GPIO_ACTIVE_HIGH>;
};

key0 {
    compatible = "qkx,irq";
    status = "okay";
    key0-gpio = <&gpiog 3 GPIO_ACTIVE_LOW>;
    interrupt-parent=<&gpiog>;
    interrupts=<3 IRQ_TYPE_EDGE_FALLING>;
};

key1 {
    compatible = "qkx,irq";
    status = "okay";
    key1-gpio = <&gpioh 7 GPIO_ACTIVE_LOW>;
    interrupt-parent=<&gpioh>;
    interrupts=<7 IRQ_TYPE_EDGE_FALLING>;
};

wkup {
    compatible = "qkx,irq";
    status = "okay";
    wkup-gpio = <&gpioa 0 GPIO_ACTIVE_HIGH>;
    interrupt-parent=<&gpioa>;
    interrupts=<0 IRQ_TYPE_EDGE_RISING>;
}; 
  • 设备树编译,并拷贝到tftp image.png
qinkaixin@qinkaixin-virtual-machine:~/tools/atk_install/alientek_linux$ make dtbs
  DTC     arch/arm/boot/dts/stm32mp157d-atk.dtb
  DTC     arch/arm/boot/dts/stm32mp157d-atk-mipi.dtb
  DTC     arch/arm/boot/dts/stm32mp157d-atk-hdmi.dtb
qinkaixin@qinkaixin-virtual-machine:~/tools/atk_install/alientek_linux$ cp /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/dts/stm32mp157d-atk.dtb /home               /qinkaixin/linux/tftpboot/

2 驱动开发设计

2.1 字符设备设计过程

  • 设备树结构体 image.png
  • 设备树解析 image.png
  • key0,下降沿触发 image.png
  • 字符设备初始化函数 image.png image.png
  • 字符设备初始化 image.png
  • 字符设备释放 image.png

2.1 中断函数初始化

  • 中断函数启动定时器,防抖操作 image.png
  • 定时器处理函数 image.png

3 调试验证

image.png image.png

3.1 应用程序开发

image.png

3.2 Makefile编写

image.png

3.3 驱动编译及拷贝到tftp

image.png

cd key0irq/
sudo depmod
make
arm-none-linux-gnueabihf-gcc key0irqApp.c -o key0irqApp
sudo cp key0irq.ko key0irqApp /home/qinkaixin/linux/nfs/rootfs/lib/modules/5.4.31/ -f

cd key1irq/
sudo depmod
make
arm-none-linux-gnueabihf-gcc key1irqApp.c -o key1irqApp
sudo cp key1irq.ko key1irqApp /home/qinkaixin/linux/nfs/rootfs/lib/modules/5.4.31/ -f

cd wkupirq/
sudo depmod
make
arm-none-linux-gnueabihf-gcc wkupirqApp.c -o wkupirqApp
sudo cp wkupirq.ko wkupirqApp /home/qinkaixin/linux/nfs/rootfs/lib/modules/5.4.31/ -f

3.4 设备树拷贝到tftp

cp /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/uImage /home/qinkaixin/linux/tftpboot/

3.5 网络调试

  • 网络调试环境配置(以NFS作为根文件系统,也可以烧录到EMMC)
    1:IP设置
    setenv ipaddr 192.168.0.105 
    setenv ethaddr b8:ae:1d:01:01:01 
    setenv gatewayip 192.168.0.1 
    setenv netmask 255.255.255.0 
    setenv serverip 192.168.0.111 
    saveenv 

    2:nfs调试 
    nfs C2000000 192.168.0.111:/home/qinkaixin/linux/nfs/rootfs/test 

    3:设置nfs根文件系统 
    setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.0.111:/home/qinkaixin/linux/nfs/rootfs,proto=tcp rw ip=192.168.0.105:192.168.0.111:192.168.0.1:255.255.255.0::eth0:off' saveenv 

    4:tftp网络调试 setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000' saveenv boot
  • 进入开发板/lib/modules/5.4.31目录,执行驱动挂载 image.png
cd /lib/modules/5.4.31/
modprobe key0irq.ko
modprobe key1irq.ko
modprobe wkupirq.ko
cat /proc/interrupts

image.png

  • 测试
./key0irqApp /dev/key0
./key1irqApp /dev/key1
./wkupirqApp /dev/wkup