说明
如果驱动中使用了gpio,通过echo方式拉高gpio是不行的,只能写寄存器的方式拉高电平
操作步骤
在fm驱动中写寄存器的方式修改gpio电平
From f36cb20e53ab9aa48d4b8d34888cc698183c6e27 Mon Sep 17 00:00:00 2001
From: zhoujinyan <zhoujy@ibumobile.com>
Date: Fri, 15 May 2020 22:26:55 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3FM=E8=AE=BE=E5=A4=87=E8=8A=82?=
=?UTF-8?q?=E7=82=B9=E6=B2=A1=E6=9C=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
kernel/msm-3.18/sound/i2c/rdafm_drv.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/kernel/msm-3.18/sound/i2c/rdafm_drv.c b/kernel/msm-3.18/sound/i2c/rdafm_drv.c
index c1e4171..9cd2a0f 100644
--- a/kernel/msm-3.18/sound/i2c/rdafm_drv.c
+++ b/kernel/msm-3.18/sound/i2c/rdafm_drv.c
@@ -15,6 +15,8 @@
#include <linux/delay.h>
#include <linux/slab.h>
+#include "../../drivers/pinctrl/qcom/pinctrl-msm.h"
+
//#include <linux/fm.h>
#define FM_RX_BAND 1
//flag
@@ -1223,11 +1225,21 @@ static int fm_ops_release(struct inode *inode, struct file *filp)
return err;
}
+extern void __iomem *base_iomem(void);
static int fm_init(struct i2c_client *client)
{
int err;
struct fm *fm = NULL;
int ret = -1;
+
+ void __iomem *regs;
+ regs = base_iomem();
+ writel(0x201, regs + 0x8a000);//gpio138--->0x8a
+ writel(0x03, regs + 0x8a004);//gpio138--->0x8a
+ writel(0x201, regs + 0x00000);//gpio0--->0x8a
+ writel(0x03, regs + 0x00004);//gpio0--->0x8a
+ FM_ALERT("fm_init,powerup......\n");
+ msleep(50);
FM_DEBUG("%s\n", __func__);
if (!(fm = kzalloc(sizeof(struct fm), GFP_KERNEL)))
@@ -1348,7 +1360,16 @@ static int fm_powerup(struct fm *fm, struct fm_tune_parm *parm)
int ret = -1;
struct i2c_client *client = fm->i2c_client;
-
+
+ void __iomem *regs;
+ regs = base_iomem();
+ writel(0x201, regs + 0x8a000);//gpio138--->0x8a
+ writel(0x03, regs + 0x8a004);//gpio138--->0x8a
+ writel(0x201, regs + 0x00000);//gpio0--->0x8a
+ writel(0x03, regs + 0x00004);//gpio0--->0x8a
+ FM_ALERT("fm_powerup......\n");
+ msleep(100);
+
if (fm->powerup)
{
parm->err = FM_BADSTATUS;
--
2.7.4
注:如果是读gpio138的值是如下方法:
int value = readl(regs + 0x8a004);//gpio138