公司的一个车载项目由于gpio扣较少,所以用了艾为的一颗16路gpio口扩展芯片,下面描述一下调试过程
硬件原理图如下

aw9523b芯片寄存器较少,直接自己写了个简单的gpio驱动,采用gpio子系统驱动,比较简单,下面是dts配置以及驱动源码

dts配置aw9523: aw9523@58 {compatible = "awinic,aw9523_gpio";aw9523_reset-gpios = <&gpio 82 0>;reg = <0x58>;gpio-controller;interrupt-parent = <&gpio>;interrupt-controller;#gpio-cells = <2>;interrupts = <14 0x0>;};驱动源码
// SPDX-License-Identifier: GPL-2.0+
/** gpiolib support for Wolfson WM835x PMICs** Copyright 2009 Wolfson Microelectronics PLC.** Author: Mark Brown <broonie@opensource.wolfsonmicro.com>**/#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/gpio/driver.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/leds.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/gpio/consumer.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/regulator/consumer.h>/* aw9523 register */
#define AW9523_REG_CHIPID 0x10
#define AW9523_LED_MODE_P0 0x12
#define AW9523_LED_MODE_P1 0x13
#define AW9523_LED_MODE 0x00
#define AW9523_CHIPID 0x23
#define AW9523_REG_MAX 0x7F
#define AW9523_REG_BRIGHTNESS_BASE 0x20struct aw9523_gpio {int aw9523_init_finished;int reset_gpio;struct gpio_desc *aw9523_rst_gpio;struct i2c_client *aw9523_client;struct gpio_chip aw9523_gpio_chip;struct device dev;spinlock_t lock;
};static u8 reg_read(struct aw9523_gpio *aw9523_gpio_dev, u8 reg)
{u8 buf;int ret;struct i2c_msg msgs[] = {{.addr  = aw9523_gpio_dev->aw9523_client->addr,.flags = 0,.len   = 1,.buf   = &reg,}, {.addr  = aw9523_gpio_dev->aw9523_client->addr,.flags = I2C_M_RD,.len   = 1,.buf   = &buf,},};ret = i2c_transfer(aw9523_gpio_dev->aw9523_client->adapter, msgs, ARRAY_SIZE(msgs));if (ret < 0) {dev_err(&aw9523_gpio_dev->aw9523_client->dev, "aw9523 Reading register %x from %x failed\n",reg, aw9523_gpio_dev->aw9523_client->addr);return ret;}return buf;
}static int aw9523_read_reg(struct aw9523_gpio *aw9523_gpio_dev, u8 reg)
{int rc;rc = reg_read(aw9523_gpio_dev,reg);dev_err(&aw9523_gpio_dev->aw9523_client->dev,"aw9523 read reg = %02x, value = %02x****\n",reg,rc);rc = i2c_smbus_read_byte_data(aw9523_gpio_dev->aw9523_client, reg);if (rc < 0) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> can't read from %02x, i2c addr= %02x\n", __func__, reg, aw9523_gpio_dev->aw9523_client->addr);return -rc;}return rc;
}static int aw9523_write_reg(struct aw9523_gpio *aw9523_gpio_dev, u8 reg, u8 val)
{int rc;rc = i2c_smbus_write_byte_data(aw9523_gpio_dev->aw9523_client, reg,val);if (rc < 0) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> can't write %02x to %02x\n", __func__, val, reg);return -rc;}return 0;
}static int aw9523_check_chipid(struct aw9523_gpio *aw9523_gpio_dev)
{u8 val;u8 cnt;for (cnt = 5; cnt > 0; cnt--) {val = aw9523_read_reg(aw9523_gpio_dev, AW9523_REG_CHIPID);dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> aw9523 chip id %0x\n", __func__, val);if (val == AW9523_CHIPID)return 0;}return -EINVAL;
}
int aw9523_gpio_get_value(struct aw9523_gpio *aw9523_gpio_dev, int port)
{u8 val;int value;if (aw9523_gpio_dev->aw9523_init_finished == 0) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> aw9523 is not inited\n", __func__);return -EPERM;}if (port < 0 || port > 15) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> invalid port: %d\n", __func__, port);return -EINVAL;}if (value != 0 && value != 1) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> invalid value\n", __func__);return -EINVAL;}val = (u8)aw9523_read_reg(aw9523_gpio_dev, 0x02 + port / 8);value = (val >> port) & 1;return value;
}int aw9523_gpio_set_value(struct aw9523_gpio *aw9523_gpio_dev, int port,int value)
{u8 val;if (aw9523_gpio_dev->aw9523_init_finished == 0) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> aw9523 is not inited\n", __func__);return -EPERM;}if (port < 0 || port > 15) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> invalid port: %d\n", __func__, port);return -EINVAL;}if (value != 0 && value != 1) {dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> invalid value\n", __func__);return -EINVAL;}//   val = (u8)aw9523_read_reg(aw9523_gpio_dev, 0x02 + port / 8);if (value == 0)val &= ~(1 << (port % 8));elseval |= 1 << (port % 8);dev_err(&aw9523_gpio_dev->aw9523_client->dev,"<%s> begin to write reg\n", __func__);return aw9523_write_reg(aw9523_gpio_dev, 0x02 + port / 8, val);
}static int aw9523_gpio_get(struct gpio_chip *chip, unsigned int offset)
{int value;unsigned long flags;struct aw9523_gpio *aw9523_gpio_dev =container_of(chip, struct aw9523_gpio, aw9523_gpio_chip);spin_lock_irqsave(&aw9523_gpio_dev->lock, flags);value = aw9523_gpio_get_value(aw9523_gpio_dev, offset);spin_unlock_irqrestore(&aw9523_gpio_dev->lock, flags);return value;
}static void aw9523_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{unsigned long flags;struct aw9523_gpio *aw9523_gpio_dev =container_of(chip, struct aw9523_gpio, aw9523_gpio_chip);spin_lock_irqsave(&aw9523_gpio_dev->lock, flags);aw9523_gpio_set_value(aw9523_gpio_dev, offset, value);spin_unlock_irqrestore(&aw9523_gpio_dev->lock, flags);
}static int aw9523_gpio_direction_out(struct gpio_chip *chip, unsigned offset,int value)
{unsigned long flags;struct aw9523_gpio *aw9523_gpio_dev =container_of(chip, struct aw9523_gpio, aw9523_gpio_chip);spin_lock_irqsave(&aw9523_gpio_dev->lock, flags);dev_err(&aw9523_gpio_dev->aw9523_client->dev,"%s:offset = %d,value = %d\n", __func__, offset, value);aw9523_gpio_set_value(aw9523_gpio_dev, offset, value);spin_unlock_irqrestore(&aw9523_gpio_dev->lock, flags);return 0;
}static ssize_t aw9523_gpio_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{int rc;int port;int value;char port_buf[5];char value_buf[5];struct i2c_client *client =container_of(dev, struct i2c_client, dev);struct aw9523_gpio *aw9523_gpio_dev =i2c_get_clientdata(client);if (count < 2) {pr_err("<%s> invalid write string: %s\n", __func__, buf);return -EINVAL;}sscanf(buf,"%s %s",port_buf,value_buf);rc = kstrtouint(port_buf, 10, &port);rc = kstrtouint(value_buf, 10, &value);dev_err(dev, "%s:bing port = %d value = %d addr = %02x\n",__func__,port,value,aw9523_gpio_dev->aw9523_client->addr);rc = aw9523_gpio_set_value(aw9523_gpio_dev, port, value);return (rc == 0) ? count : -EINVAL;
}static DEVICE_ATTR(aw9523_gpio, S_IWUSR | S_IWGRP, NULL, aw9523_gpio_store);static int aw9523_gpio_probe(struct i2c_client *client,const struct i2c_device_id *id)
{int ret;enum of_gpio_flags flags;int i;struct aw9523_gpio *aw9523_gpio_dev;aw9523_gpio_dev = devm_kzalloc(&client->dev, (sizeof(struct aw9523_gpio)), GFP_KERNEL);if (!aw9523_gpio_dev)return -ENOMEM;aw9523_gpio_dev->aw9523_client = client;aw9523_gpio_dev->aw9523_rst_gpio =devm_gpiod_get_optional(&client->dev, "aw9523_reset", 0);if (!aw9523_gpio_dev->aw9523_rst_gpio) {dev_err(&client->dev, "invalid  reset gpio\n");return -1;} else {gpiod_direction_output(aw9523_gpio_dev->aw9523_rst_gpio, 1);msleep(20);gpiod_direction_output(aw9523_gpio_dev->aw9523_rst_gpio, 0);msleep(30);gpiod_direction_output(aw9523_gpio_dev->aw9523_rst_gpio, 1);msleep(20);}aw9523_gpio_dev->aw9523_gpio_chip.label = "aw9523_gpio";aw9523_gpio_dev->aw9523_gpio_chip.owner = THIS_MODULE;aw9523_gpio_dev->aw9523_gpio_chip.direction_output =aw9523_gpio_direction_out;aw9523_gpio_dev->aw9523_gpio_chip.set = aw9523_gpio_set;aw9523_gpio_dev->aw9523_gpio_chip.get = aw9523_gpio_get;aw9523_gpio_dev->aw9523_gpio_chip.ngpio = 16;aw9523_gpio_dev->aw9523_gpio_chip.parent = &client->dev;aw9523_gpio_dev->aw9523_gpio_chip.base = -1;ret = devm_gpiochip_add_data(&client->dev,&(aw9523_gpio_dev->aw9523_gpio_chip),&(aw9523_gpio_dev->aw9523_gpio_chip));if (ret) {dev_err(&client->dev, "devm_gpiochip_add_data error\n");return -EINVAL;}ret = aw9523_check_chipid(aw9523_gpio_dev);if (ret) {dev_err(&client->dev, "Check chip id error\n");return -EINVAL;}// set P0 port as push-pull modeaw9523_write_reg(aw9523_gpio_dev, 0x11, 0x10);aw9523_write_reg(aw9523_gpio_dev, 0x12, 0xff);aw9523_write_reg(aw9523_gpio_dev, 0x13, 0xff);// P0 and P1 port output modeaw9523_write_reg(aw9523_gpio_dev, 0x04, 0x00);aw9523_write_reg(aw9523_gpio_dev, 0x05, 0x00);// disable interrupt function of P0 and P1 portaw9523_write_reg(aw9523_gpio_dev, 0x06, 0xff);aw9523_write_reg(aw9523_gpio_dev, 0x07, 0xff);// P0 and P1 port output low levelaw9523_write_reg(aw9523_gpio_dev, 0x02, 0x00);aw9523_write_reg(aw9523_gpio_dev, 0x03, 0x00);spin_lock_init(&aw9523_gpio_dev->lock);aw9523_gpio_dev->aw9523_init_finished = 1;i2c_set_clientdata(client, aw9523_gpio_dev);ret = device_create_file(&client->dev, &dev_attr_aw9523_gpio);if (ret) {pr_err("<%s> create file aw9523_gpio failed\n", __func__);return -EPERM;}dev_err(&client->dev, "aw9523_probe succeeded\n");return 0;
}static int aw9523_gpio_remove(struct i2c_client *client)
{return 0;
}static const struct of_device_id aw9523_match_table[] = {{.compatible = "awinic,aw9523_gpio",},{},
};static const struct i2c_device_id aw9523_id[] = {{ "awinic,aw9523_gpio", 0 },{},
};
MODULE_DEVICE_TABLE(i2c, aw9523_id);static struct i2c_driver aw9523_driver = {.driver = {.name = "aw9523-gpio",.owner      = THIS_MODULE,.of_match_table = aw9523_match_table,},.probe    = aw9523_gpio_probe,.remove   = aw9523_gpio_remove,.id_table = aw9523_id,
};module_i2c_driver(aw9523_driver);
MODULE_LICENSE("GPL V2");```c
在这里插入代码片

安霸平台gpio扩展芯片aw9523b调试相关推荐

  1. 【arduino】玩CyberPi童芯派之真点灯,点亮板载RGB灯,GPIO扩展芯片AW9523B驱动

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 上周开了个头,简单介绍了一下CyberPi童芯派,今天开始搞驱动,本来是想搞彩屏的,还 ...

  2. 安霸Ambarella CV系列芯片

    安霸Ambarella CV系列芯片 关于Ambarella(安霸半导体) Ambarella 的产品广泛应用于人类和计算机视觉领域,包括视频安防.高级驾驶辅助系统(ADAS).电子后视镜.行车记录仪 ...

  3. MTK平台GPIO的使用与调试

    一,DWS的配置 二,Kernel中配置和使用GPIO 三,使用ADB获取/配置GPIO 我们在LINUX外设驱动的开发与调试中,GPIO的正确使用是一门必修课,本文主要描述MTK平台GPIO的使用和 ...

  4. 安霸平台led芯片aw9523b调试

    公司的车载项目用到了一颗艾为的led芯片驱动16路led,下面描述一下调试过程 硬件原理图如下 aw9523 驱动采用led驱动框架,比较简单,调用内核API直接注册进led子系统可以了,下面是dts ...

  5. 安霸平台_MCTF调试思路

    调试参数顺序,优先黑色部分:其次黄色部分:最后绿色部分(使用使用默认值,可以不关注) MCTF也叫3D降噪,检测运动区域(阴影变化和真实motion的区分,以应对复杂的光照条件),静止区域:运动区域采 ...

  6. TI 海思 安霸 智利普 等顶级摄像机芯片简要介绍

    很多年以前业界就谈到安防视频监控领域的三个趋势:数字化.网络化.智能化.目前国内市场上安防视频监控系统的主流产品已经从十多年前的纯模拟视频监控系统,逐步转变成了纯数字的百万高清视频监控系统,即从视频采 ...

  7. 安霸收购4D雷达公司,下一代“融合感知”市场大战一触即发

    激光雷达已经成为高端智能汽车的选择项,特斯拉则继续深耕纯视觉+人工智能数据驱动解决方案,而占据ADAS视觉第三方市场份额领先位置的Mobileye则选择了激光雷达+4D成像雷达. 就在本月初,成立于2 ...

  8. 基建互联 | 安霸与飞桨深度合作,高性能算法落地简单高效!

    面对人工智能算法在端侧落地的需求,安霸在芯片产品线.工具链和软件开发包上都提供了完整成熟的解决方案.人工智能芯片CV2x系列提供了丰富多样的算力平台,完美适配从消费领域的智能门铃,工业安防领域的智能交 ...

  9. 【交叉编译】海思平台和安霸平台交叉编译

    海思平台 板端编译首先需要配置系统的NFS,挂载NFS服务器:然后安装ubuntu下的交叉编译环境(3516A和3518为例):登录板端:板端编译(需要修改相关的makefile文件):板端运行: 一 ...

最新文章

  1. 编译工具 之 ant
  2. python SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: trunca
  3. 一天搞定CSS:支持IE的Layout布局--16
  4. mscoreei.dll没有被指定在windows上运行_windows注册表详解
  5. 大图详解负载神器 LVS、Nginx及HAProxy工作原理
  6. 大数据可视化html模板开源_大数据时代-可视化数据分析平台必不可少
  7. 【leetcode刷题笔记】Single Number
  8. alook浏览器js扩展网站_备用浏览器Alook所能实现的功能果真强大(文末有alook兑换码抽奖)...
  9. vs2015+opencv3.2.0配置的一些小事情
  10. 云版 Android 系统来了?
  11. Android事件机制全然解析
  12. 计算机语言的比较英文论文,科学网—撰写高质量英文科技论文的心态、布局、程序和方法 - 岳中琦的博文...
  13. spring 实现小程序抖音去水印后台
  14. 智能家居-斐讯N1安装篇
  15. kindeditor 加载 html,为kindeditor编辑器添加“引用”(blockquote)标签
  16. 交换机与路由器与猫的区别与联系
  17. java写入文件中文乱码问题_解决Java写入UTF-8文件中文乱码问题
  18. Springboot 项目学习
  19. Appium统计iOS或者Android应用的性能
  20. 最好用的房屋租赁软件(租赁行业)

热门文章

  1. ul,ol,dl区别
  2. 经典Excel VBA代码
  3. 什么是闭包?(前端面试题系列)
  4. elementUI脚手架
  5. linux下.tar.gz如何解压
  6. 三国杀:智能电视迎来对垒时代
  7. mount 中文man(转)
  8. linux系统服务器忘记密码怎么办
  9. html5页面发送短信验证码,H5实现APP“输入短信验证码”效果
  10. 聊一聊2038年问题