linux开发板上的中断如何编写,手把手教你写Linux设备驱动---中断(一)(基于友善之臂4412开发板)...

本文详细介绍了如何在Linux系统下为Tiny4412开发板编写一个简单的按键中断驱动程序。首先,解释了Linux中断的基本概念,包括IRQ线和可编程中断控制器。接着,通过分析4412板子的电路图,展示了按键与GPIO引脚的连接,并指出了在板级文件中预定义的GPIO宏。然后,列举了Linux内核提供的中断驱动API函数,如`request_irq`和`free_irq`等,并给出了一个示例代码,展示如何申请和释放中断,以及注册中断处理函数。最后,提到了在内核配置中屏蔽原有按键驱动的注意事项,以确保新驱动的正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,我们要来实现一个基于tiny4412开发板上的最简本的按键中断驱动程序,那么,写这个程序之前,我们先来了解下Linux中断的基本知识。

在Linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,我们可以来看下4412上与板子上相连的按键。

下面这张电路图,也就是4412板子上按键的电路图和CPU的连接关系图:

c99b7c3ef8afbff7550f67f9fdc06d70.png

我们明显可以看到,4个按键分别接在GPX3这几个引脚上,对应着引脚,接下来我们就可以看数据手册,配置寄存器了

0df5e1b97906b8249f7b214b5a82935b.png

在4412的板级文件配置中,已经提供了IO口的定义,在以下文件中可以找到,这样我们就不用去配置寄存器了,内核已经帮我们配好了:

找到这个文件:

arch/arm/mach-exynos/include/mach/gpio.h

然后找到我们要配置按键的宏:

#define EXYNOS4_GPX3(_nr)(EXYNOS4_GPIO_X3_START + (_nr))

对应的,我们的按键nr就是2,3,4,5 。 因为板子上有4个按键。

那么如何来写一个按键中断程序?Linux内核为我们提供了大量的有关编写中断驱动程序的API函数,我们只需要会使用就行了,不用去看着手册一个个配置,很方便,API列表如下:

#include

int request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname, void *dev_id)

irq:

中断号 arch/arm/plat-s3c64xx/include/plat/irqs.h

handler:

中断处理函数 irqreturn_t handler(int irq, void *dev_id);

irqreturn_t:

See include/linux/irqreturn.h

irqflags:

See line 21-59 in include/linux/interrupt.h

使用IRQF_SHARED共享irq时, irqflags必须相同

如: request_irq(IRQ_EINT(0), handler1,

IRQF_TRIGGER_FALLING | IRQF_SHARED, "dev1", &dev1);

request_irq(IRQ_EINT(0), handler2,

IRQF_TRIGGER_FALLING | IRQF_SHARED, "dev2", &dev2);

devname:

设备名, cat /proc/interrupts

dev_id:

发生中断时将dev_id传递给handler函数,

irqflags含有IRQF_SHARED时dev_id不能为NULL, 并且要保证唯一

dev_id一般采用当前设备的结构体指针

void free_irq (unsigned int irq, void * dev_id);

释放匹配irq和dev_id的中断, 如果irq有多个相同的dev_id, 将释放第一个

So, 共享中断的dev_id不是唯一时, 可能会释放到其它设备的中断

void disable_irq(unsigned int irq);

关闭irq号中断

void enable_irq(unsigned int irq);

开启irq号中断

void local_irq_save(unsigned long flags);

关闭当前CPU中断并保存当前状态到flags

void local_irq_restore(unsigned long flags);

恢复flags到当前CPU

void local_irq_disable(void);

关闭当前CPU中断

void local_irq_enable(void);

开启当前CPU中断

注: 没有关闭和开启所有CPU中断的函数(没必要)

而申请中断号,需要使用这个函数来实现:

static inline int gpio_to_irq(unsigned int gpio)

只要往里面传一个参数,这个参数就是我们上面说的板级文件里的那个宏,它就用自动帮你申请中断号。接下来,我们就来实现这个简单的按键驱动程序:

步骤:

1、申请中断号

2、注册中断服务

代码:

/*

* linux/drivers/char/tiny4412_pwm.c

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License version 2 as

* published by the Free Software Foundation.

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include /*timer*/

#include /*jiffies*/

#include

#include

//中断服务函数

static irqreturn_t irq_fuction(int irq, void *dev_id)

{

printk("key_irq:%d\n",irq);

return IRQ_HANDLED ;

}

static int __init tiny4412_Key_irq_test_init(void)

{

int err = 0 ;

int irq_num1 ;

int irq_num2 ;

int irq_num3 ;

int irq_num4 ;

printk("irq_key init\n");

//为4个按键都申请中断号

irq_num1 = gpio_to_irq(EXYNOS4_GPX3(2));

irq_num2 = gpio_to_irq(EXYNOS4_GPX3(3));

irq_num3 = gpio_to_irq(EXYNOS4_GPX3(4));

irq_num4 = gpio_to_irq(EXYNOS4_GPX3(5));

//请求中断

request_irq(irq_num1,irq_fuction,IRQF_TRIGGER_FALLING,"tiny4412_key1",(void *)"key1");

request_irq(irq_num2,irq_fuction,IRQF_TRIGGER_FALLING,"tiny4412_key2",(void *)"key2");

request_irq(irq_num3,irq_fuction,IRQF_TRIGGER_FALLING,"tiny4412_key3",(void *)"key3");

request_irq(irq_num4,irq_fuction,IRQF_TRIGGER_FALLING,"tiny4412_key4",(void *)"key4");

return 0 ;

}

static void __exit tiny4412_Key_irq_test_exit(void)

{

//释放中断irq

int irq_num1 ;

int irq_num2 ;

int irq_num3 ;

int irq_num4 ;

printk("irq_key init\n");

irq_num1 = gpio_to_irq(EXYNOS4_GPX3(2));

irq_num2 = gpio_to_irq(EXYNOS4_GPX3(3));

irq_num3 = gpio_to_irq(EXYNOS4_GPX3(4));

irq_num4 = gpio_to_irq(EXYNOS4_GPX3(5));

free_irq(irq_num1,(void *)"key1");

free_irq(irq_num2,(void *)"key2");

free_irq(irq_num3,(void *)"key3");

free_irq(irq_num4,(void *)"key4");

}

module_init(tiny4412_Key_irq_test_init);

module_exit(tiny4412_Key_irq_test_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("YYX");

MODULE_DESCRIPTION("Exynos4 KEY Driver");编译好下zImage到开发板上,按下对应的按键可以看到Log信息:

2139b433f83e536f295ade29130c9a50.png

还要注意一点,内核里,要将原先友善之臂实现的对应的按键驱动程序给屏蔽掉。

如果是配置android的内核,就需要将板级文件配置中的下面这个初始化给干掉,这个按键驱动才能够注册成功,才能够看到以上效果:

板级驱动文件位于:

arch/arm/mach/exynos/mach-tiny4412.c

找到这个结构体:

static struct platform_device *smdk4x12_devices[] __initdata = {

。。。。。

#ifdef CONFIG_SAMSUNG_DEV_KEYPAD

&samsung_device_keypad,

#endif

&tiny4412_device_1wire,

&tiny4412_device_adc,

#ifdef CONFIG_INPUT_GPIO

&tiny4412_input_device,

#endif

};

将以上的&tiny4412_input_device,注释,再重新编译即可。

本文同步分享在 博客“Engineer-Bruce_Yang”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

<think>好的,用户想用i.MX8MP和QCA2076组合DIY个简易路由器。我需要先了解这两个硬件的具体情况以及如何将它们结合起来。i.MX8MP是恩智浦的款高性能处理器,适合嵌入式应用,而QCA2076是高通的Wi-Fi芯片,可能支持双频或者某种特定的无线标准。首先,我需要确认这两个组件的接口兼容性,比如是否都支持PCIe或者USB连接。如果接口不匹配,可能需要额外的转换模块。 接下来,用户可能需要硬件连接方面的指导,比如如何将QCA2076连接到i.MX8MP的开发板上。可能需要焊接或者使用扩展接口。然后是软件配置,i.MX8MP通常运行Linux系统,需要编译或加载对应的无线驱动,特别是QCA2076的驱动是否在Linux内核中有支持,或者是否需要从高通获取专有驱动。 另外,路由功能需要配置网络接口,设置NAT、DHCP、防火墙等。用户可能需要安装和配置软件如hostapd、dnsmasq或者使用更完整的方案如OpenWRT。需要分步骤说明如何安装这些软件,修改配置文件,测试无线功能是否正常。 还要考虑电源管理,硬件散热,天线连接等实际问题。是否需要外接电源,如何确保信号稳定性。用户可能还需要指导如何进行网络测试,比如测速、信号强度检测等。最后,可能还要提醒用户注意法规问题,确保自制的路由器符合当地的无线电管理规定。</think>好的!下面将手把手您使用i.MX8MP开发板(基于NXP i.MX8M Plus处理器)搭配QCA2076无线芯片组合DIY款简易路由器,分硬件搭建和软件配置两大部分说明: --- ### 、硬件准备 **核心组件清单**: 1. **i.MX8MP开发板**(如NXP官方EVK或友善之派等第三方板) - 关键特性:4xCortex-A53 + 1xCortex-M7,双千兆网口,PCIe 3.0接口 2. **QCA2076无线模组** - 支持Wi-Fi 6(802.11ax)2.4/5GHz双频 - 接口要求:需PCIe或USB3.0接口(根据模组型号选择) 3. **天线组件**:2.4GHz/5GHz双频天线 4. **电源适配器**:12V/3A以上电源 5. **调试工具**:USB-TTL串口线、网线 **硬件连接步骤**: 1. **安装无线模组**: - 若QCA2076采用PCIe接口:插入开发板的M.2 Key E或PCIe插槽 - 若采用USB接口:连接至开发板的USB3.0 Type-A口 2. **连接天线**:将SMA天线拧到QCA2076的RF接口 3. **网络连接**: - WAN口:用网线连接开发板的eth0到光猫/上级路由 - LAN口:eth1可连接PC或其他设备(可选) --- ### 二、软件配置(基于Linux系统) #### 步骤1:系统环境搭建 1. **刷系统**: ```bash # 下载官方Yocto镜像(如L5.15.52内核) $ wget https://.../imx8mp-image-core.bin # 使用uuu工具烧录 $ sudo uuu -b emmc_all imx8mp-image-core.bin ``` 2. **连接串口调试**: ```bash $ screen /dev/ttyUSB0 115200 ``` #### 步骤2:驱动加载 1. **确认硬件识别**: ```bash # PCIe设备检测 $ lspci | grep Qualcomm # 或USB设备检测 $ lsusb ``` 2. **安装QCA驱动**: ```bash # 从高通官网下载qca6174驱动(QCA2076通常兼容) $ tar -xvf qca6174-linux-driver.tar.gz $ cd qca6174 $ make -j4 $ sudo make install ``` #### 步骤3:网络配置 1. **创建虚拟接口**: ```bash # 启用wlan0 $ ip link set wlan0 up # 创建AP接口 $ iw dev wlan0 interface add ap0 type __ap ``` 2. **配置hostapd(Wi-Fi热点)**: ```bash # 安装hostapd $ sudo apt install hostapd # 创建配置文件/etc/hostapd.conf: interface=ap0 driver=nl80211 ssid=My_iMX8MP_Router hw_mode=a channel=36 wpa=2 wpa_passphrase=12345678 ``` 3. **配置DHCP服务**: ```bash # 安装dnsmasq $ sudo apt install dnsmasq # 编辑/etc/dnsmasq.conf: interface=ap0 dhcp-range=192.168.50.100,192.168.50.200,255.255.255.0,24h ``` #### 步骤4:启动服务 ```bash # 启动Hostapd $ sudo hostapd -B /etc/hostapd.conf # 启动DHCP $ sudo systemctl restart dnsmasq # 开启IP转发 $ sudo sysctl -w net.ipv4.ip_forward=1 # 配置NAT(假设eth0是WAN口) $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` --- ### 三、功能验证 1. **Wi-Fi扫描**: ```bash $ iw dev ap0 scan | grep SSID ``` 2. **客户端连接测试**: - 用手机/笔记本搜索SSID "My_iMX8MP_Router" 并输入密码连接 3. **测速验证**: ```bash $ iperf3 -s # 在开发板运行 # 在客户端执行 $ iperf3 -c 192.168.50.1 ``` --- ### 四、进阶优化 1. **OpenWRT移植**(推荐): - 下载imx8mp的OpenWRT SDK - 集成QCA2076驱动到镜像 2. **Web管理界面**: ```bash $ sudo apt install luci $ sudo service uhttpd start ``` 3. **安全加固**: - 启用防火墙规则 - 设置MAC地址过滤 --- **注意事项**: 1. 高通QCA2076需确认是否开放Linux驱动支持 2. 发射功率需符合当地无线电法规(可通过iw命令调整) 3. 建议添加散热片防止高温降频 通过以上步骤,您将获得个具备基本路由/NAT/Wi-Fi功能的开发板级路由器原型,后续可扩展USB 4G模块实现4G路由,或增加SATA接口连接硬盘实现NAS功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值