高通DTS 配置 GPIO 中断


1. 映射键值
@ \device\qcom\msm8909\gpio-keys.kl
key 212   SOS

上层同事在 frameworks\base\core\java\android\view\KeyEvent.java 定义键值:
public static final int KEYCODE_SOS = 528; //( 0x210 )

2. 配置 GPIO dts

2.1 配置 中断键值 
@ \kernel\msm-3.18\arch\arm\boot\dts\qcom\msm8909-mtp.dtsi
搜索 gpio_keys 关键字:

gpio_keys {
		compatible = "gpio-keys";
		input-name = "gpio-keys";
		pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
		pinctrl-0 = <&gpio_key_active>;
		pinctrl-1 = <&gpio_key_suspend>;

		new add 20190923 begin///
		key_sos {
			label = "key_sos";
			gpios = <&msm_gpio 90 0x1>;
			linux,input-type = <1>;
			linux,code = <0x212>;
			gpio-key,wakeup;
			debounce-interval = <15>;
		};
/*
		camera_focus {
			label = "camera_focus";
			gpios = <&msm_gpio 91 0x1>;
			linux,input-type = <1>;
			linux,code = <0x210>;
			gpio-key,wakeup;
			debounce-interval = <15>;
		};
*/
		new add 20190923 end///

		camera_snapshot {
			label = "camera_snapshot";
			gpios = <&msm_gpio 92 0x1>;
			linux,input-type = <1>;
			linux,code = <0x2fe>;
			gpio-key,wakeup;
			debounce-interval = <15>;
		};
	};



2.2 配置 gpio 为输入模式
@ \kernel\msm-3.18\arch\arm\boot\dts\qcom\msm8909-pinctrl.dtsi

搜索 gpio_keys 关键字,检查是还有 GPIO90,
下面代码,看起来 GPIO 90 已经配置成 输入模式了

		tlmm_gpio_key {
			gpio_key_active: gpio_key_active {
				mux {
					pins = "gpio90", "gpio91", "gpio92";
					function = "gpio";
				};

				config {
					pins = "gpio90", "gpio91", "gpio92";
					drive-strength = <2>;
					bias-pull-up;
				};
			};

			gpio_key_suspend: gpio_key_suspend {
				mux {
					pins = "gpio90", "gpio91", "gpio92";
					function = "gpio";
				};

				config {
					pins = "gpio90", "gpio91", "gpio92";
					drive-strength = <2>;
					bias-pull-up;
				};
			};
		};

修改完毕后,可以使用

adb shell getevent

然后按键,看对应的 事件是否正确

### 关于高通平台串口接收(RX)中断的实现与配置 #### 1. GPIO 和 UART 配置 对于高通平台上的串口通信,特别是涉及接收(RX)中断的情况,需要特别注意GPIO和UART的具体配置。在某些情况下,特定的GPIO引脚可能被用于不同的功能,例如`GPIO_6/BLSP2_SPI_CS_N /BLSP2_UART_CTS_N /BLSP2_I2C_SDA_A AV14`并不是唤醒中断的一部分[^2]。 #### 2. DTS 文件中的 UART 配置 为了使能串口中断,在设备树源文件(DTS)中正确配置UART是非常重要的。这涉及到修改相应的DTS文件以包含必要的platform_data设置,并且有时还需要禁用其他冲突的功能模块,比如SPI接口。具体操作可以在`arch/arm/boot/dts/msm8610.dtsi`这样的路径下完成,同时确保注释掉任何可能导致资源竞争的现有定义[^4]。 ```c // Example of disabling SPI and enabling UART in DTS file &spi_2 { status = "disabled"; }; &blsp2_uart3 { pinctrl-names = "default", "sleep"; pinctrl-0 = <&blsp2_uart3_default>; pinctrl-1 = <&blsp2_uart3_sleep>; }; ``` #### 3. 接收缓冲区溢出问题及其解决方案 当讨论到串口接收时,一个重要问题是防止接收缓冲区(FIFO)溢出导致的数据丢失。如果CPU未能及时处理接收到的数据,则可能会发生这种情况。为了避免这个问题,可以通过调整IRQ调度策略来提高响应速度,使得即使是在多核环境中也能更有效地利用高性能的核心来进行关键任务处理[^1]。 #### 4. 中断服务程序 (ISR) 编写高效的中断服务程序(ISR),以便能够快速响应并读取来自串口的数据。ISR应该尽可能简洁高效,只做最基本的错误检测和服务标志清除工作;实际的数据解析和其他复杂逻辑应放在下半部(deferred work)执行。 ```c static irqreturn_t uart_rx_interrupt(int irq, void *dev_id) { struct uart_port *port = dev_id; while (!uart_handle_sysrq_char(port, serial_in(port, UART_RX))) { unsigned int ch = serial_in(port, UART_RX); if (ch == UART_LSR_BRK_ERROR_BITS || uart_handle_break(port)) continue; uart_insert_char(port, UART_LSR_OE, UART_LSR_BI, ch, TTY_NORMAL); port->icount.rx++; } tty_flip_buffer_push(&port->state->port); return IRQ_HANDLED; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馋喵星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值