【分析笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析

本文分析了全志T507芯片在Android 10/Linux 4.9.170环境下,PF4引脚无法设置为中断模式的问题。通过代码调试发现,中断信息描述错误导致PF4引脚编号被PG4覆盖。修正PG4的描述信息后,PF4恢复正常,同时解决了PG4和PA0的相关问题。
摘要由CSDN通过智能技术生成

相关信息

硬件平台:全志T507
系统版本:Android 10 / Linux 4.9.170
问题描述:PF4 无法通过标准接口设置为中断模式,而 PF1、PF2、PF3、PF5 正常可用。

分析过程

一开始以为是引脚被其它驱动占用引起,或者该引脚不具备中断功能,经过排查,已排除这两种可能,因此通过从源码分析来找问题的根因。

以下是以 gpio_keys.c 驱动为入口进行分析:

// drivers/input/keyboard/gpio_keys.c
static int gpio_keys_setup_key(struct platform_device *pdev,
				struct input_dev *input,
				struct gpio_button_data *bdata,
				const struct gpio_keys_button *button)
{
   
	......
	error = devm_request_any_context_irq(&pdev->dev, bdata->irq,
					     isr, irqflags, desc, bdata);
}

// kernel/irq/devres.c
int devm_request_any_context_irq(struct device *dev, unsigned int irq,
			      irq_handler_t handler, unsigned long irqflags,
			      const char *devname, void *dev_id)
{
   
	......
	rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id);
	if (rc < 0) {
   
		devres_free(dr);
		return rc;
	}
	......
	return rc;
}

// kernel/irq/manage.c
int request_any_context_irq(unsigned int irq, irq_handler_t handler,
			    unsigned long flags, const char *name, void *dev_id)
{
   
	......
	ret = request_irq(irq, handler, flags, name, dev_id);
	return !ret ? IRQC_IS_HARDIRQ : ret;
}

// include/linux/interrupt.h
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
	    const char *name, void *dev)
{
   
	return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}

// kernel/irq/manage.c
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
			 irq_handler_t thread_fn, unsigned long irqflags,
			 const char *devname, void *dev_id)
{
   
	......
	chip_bus_lock(de
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
全志T507芯片支持DMA(直接内存访问)模式来配置串口。DMA模式可以提高串口传输效率,减少CPU的负载和功耗。下面是配置全志T507串口为DMA模式的步骤: 1. 首先,需要在系统的设备树(Device tree)中进行配置。打开设备树文件,在对应的串口节点下,添加以下代码: ``` dma-names = "rx", "tx"; dmas = <&dma X>, <&dma X>; ``` 其中,X的值代表DMA控制器的编号,可以根据硬件设计来确定具体的值。 2. 接下来,需要在系统启动时启用DMA。在引导加载程序(Bootloader)中,找到初始化串口的代码,并添加启用DMA的代码。具体的代码内容根据不同的引导加载程序而有所不同,需要查阅相关文档。 ``` uart_dma_enable(port, RX); uart_dma_enable(port, TX); ``` 上述代码中的port是指对应的串口号,RX和TX分别表示接收和发送方向。 3. 最后,编写应用程序时,可以使用DMA传输方式进行串口数据的读写操作。具体的代码可以使用硬件抽象层(HAL)库提供的函数来实现。例如,使用DMA进行串口发送操作的代码如下: ``` HAL_UART_Transmit_DMA(&huartX, data, length); ``` huartX代表相应的串口句柄,data是待发送的数据缓冲区,length是数据长度。 通过以上步骤,我们可以成功将全志T507配置为DMA模式的串口,实现高效的数据传输。值得注意的是,具体的配置步骤可能因为硬件设计和编程环境而有所差异,以上仅为一般化的配置流程,使用时需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值