主要逻辑函数就是max92xx_i2c_read/write

/*!* @file max92xx.c** @brief max92xx GMSL1 DSI Serializer/DESerializer driver** @ingroup LCD*/
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/pinctrl/consumer.h>
#include <linux/regulator/consumer.h>static int max92xx_probe(struct i2c_client *adapter,const struct i2c_device_id *id);
static int max92xx_remove(struct i2c_client *client);static const struct i2c_device_id max92xx_id[] = {{"max9283", 0},{},
};MODULE_DEVICE_TABLE(i2c, max92xx_id);static int init_max92xx(void);static struct i2c_driver max92xx_i2c_driver = {.driver = {.owner = THIS_MODULE,.name = "max9283",},.probe = max92xx_probe,.remove = max92xx_remove,.id_table = max92xx_id,
};static struct sensor {struct i2c_client *i2c_client;
} max92xx_data;/************************************************************************ I2C transfert.***********************************************************************//*******************************************************
Function:Read data from the i2c slave device.
Input:
Output:
*********************************************************/
unsigned long max92xx_i2c_read(struct i2c_client *client, int address)
{unsigned long rxdata;u8 i2c_buf[8];u8 i2c_addr[8];struct i2c_adapter *adapter;adapter = to_i2c_adapter(client->dev.parent);i2c_addr[0] = (address & 0xff00)>>8;i2c_addr[1] = (address & 0xff);struct i2c_msg msgs[2] = {{.flags   = !I2C_M_RD,.addr  = client->addr,.len = 2,.buf   = i2c_addr,},{.flags   = I2C_M_RD,.addr   = client->addr,.len = 2,.buf   = i2c_buf,},};i2c_transfer(client->adapter, msgs, 2);//成功返回执行消息数,失败返回负//rxdata = (i2c_buf[0]<<8)|i2c_buf[1];rxdata = (i2c_buf[0]);return rxdata;
}/*******************************************************
Function:Write data to the i2c slave device.
Input:
Output:
*********************************************************/
void max92xx_i2c_write(struct i2c_client *client, int address, int data)
{u8 i2c_buf[8]; i2c_buf[0] = (address & 0xff00)>>8;i2c_buf[1] = (address & 0xff);i2c_buf[2] = data;// i2c_buf[3] = (data & 0xff00)>>8;// i2c_buf[4] = (data & 0xff);struct i2c_msg msg = {.flags = !I2C_M_RD,.addr = client->addr,.len = 3,.buf = i2c_buf,};i2c_transfer(client->adapter, &msg, 1);printk("write max92xx addr: 0x%4X  val:0x%4X\n", address, data);
}/*! Read one register from a max92xx i2c slave device.**   @param *reg        register in the device we wish to access.** @return               0 if success, an error code otherwise.*/
static inline int max92xx_read_reg(u8 reg)
{int val;val = i2c_smbus_read_byte_data(max92xx_data.i2c_client, reg);return val;}/*! Write one register of a max92xx i2c slave device.**  @param *reg        register in the device we wish to access.** @return               0 if success, an error code otherwise.*/
static int max92xx_write_reg(u8 reg, u8 val)
{s32 ret;ret = i2c_smbus_write_byte_data(max92xx_data.i2c_client, reg, val);if (ret < 0) {pr_err("%s:write reg error:reg=%2x,val=%2x\n", __func__,reg, val);}return ret;
}/*!* Maintains the information on the current state of the sensor.*/
static int max92xx_int(void)
{int ret = 0;printk("max9283_init start \n");max92xx_i2c_write(max92xx_data.i2c_client, 0x0010, 0x91);max92xx_i2c_write(max92xx_data.i2c_client, 0x0407, 0x20);max92xx_i2c_write(max92xx_data.i2c_client, 0x044D, 0x80);max92xx_i2c_write(max92xx_data.i2c_client, 0x0330, 0x80);max92xx_i2c_write(max92xx_data.i2c_client, 0x0331, 0x33);max92xx_i2c_write(max92xx_data.i2c_client, 0x005B, 0x10);max92xx_i2c_write(max92xx_data.i2c_client, 0x0053, 0x12);
//  max92xx_i2c_write(max92xx_data.i2c_client, 0x0308, 0x65);
//  max92xx_i2c_write(max92xx_data.i2c_client, 0x0332, 0x4E);max92xx_i2c_write(max92xx_data.i2c_client, 0x0333, 0xE4);
//  max92xx_i2c_write(max92xx_data.i2c_client, 0x0311, 0x50);max92xx_i2c_write(max92xx_data.i2c_client, 0x0415, 0x01);printk("max9283_init end \n");pr_debug("%s\n",__func__);return ret;
}static int max92xx_pattern_init(void)
{
//testint ret = 0;pr_debug("%s\n",__func__);//ret |= max92xx_write_reg(0x09 ,0x00);return ret;
}static int init_max92xx(void)
{
#if 1return max92xx_int();
#elsereturn max92xx_pattern_init();
#endif
}static bool check_chip_existence(void)
{
/*  if((max92xx_read_reg(0x0) == 0x35)&&(max92xx_read_reg(0x1) == 0x38)&&(max92xx_read_reg(0x2) == 0x49))return true;return false;*/return true;
}int max9283_enable(int enable)
{int ret = 0;if (enable){pr_debug("%s enter enable %d \n", __func__,enable);ret |= max92xx_write_reg(0x09, 0x01);ret |= max92xx_write_reg(0x0D, 0x01);msleep(10);ret |= max92xx_write_reg(0xE5, 0xFF);ret |= max92xx_write_reg(0xE0, 0x01);ret |= max92xx_write_reg(0xE1, 0xFF);}else{pr_debug("%s enter disable %d \n", __func__,enable);ret |= max92xx_write_reg(0x0D, 0x00);}return ret;
}
EXPORT_SYMBOL(max9283_enable);static ssize_t max92xx_reg_show(struct device *dev,struct device_attribute *attr, char *buf)
{int len;u16 i;len = sprintf(buf, "result\n");for(i = 0; i <= 0x4ff; i++){msleep(10);pr_err("runtime_max92xx: 0x%4X = 0x%2X\n", i, max92xx_i2c_read(max92xx_data.i2c_client,i));}return len;
}static ssize_t max92xx_reg_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{int len;int addr, val;len = sscanf(buf, "0x%x 0x%x", (unsigned int *)&addr ,(unsigned int *)&val);pr_info("write max92xx addr: 0x%2X\tval:0x%2X\n", addr, val);max92xx_write_reg(addr, val);return count;
}static ssize_t max92xx_reg_single_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{int len;int addr;len = sscanf(buf, "0x%x", (unsigned int *)&addr);pr_info("read max92xx addr: 0x%2X\tval:0x%2X\n", addr, max92xx_read_reg(addr));return count;
}static ssize_t max92xx_i2c_read_store(struct device *dev,struct device_attribute *attr, char *buf)
{int len;int addr;len = sscanf(buf, "0x%x", (unsigned int *)&addr);printk("read max92xx addr: 0x%4X  val:0x%4X\n", addr, max92xx_i2c_read(max92xx_data.i2c_client, addr));
}static ssize_t max92xx_i2c_write_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{int len;int addr, val;len = sscanf(buf, "0x%x 0x%x", (unsigned int *)&addr ,(unsigned int *)&val);printk("write max92xx addr: 0x%4X  val:0x%4X\n", addr, val);max92xx_i2c_write(max92xx_data.i2c_client, addr, val);return count;
}static DEVICE_ATTR(reg, (0644), max92xx_reg_show, max92xx_reg_store);
static DEVICE_ATTR(reg_single, (0644), NULL, max92xx_reg_single_store);
static DEVICE_ATTR(max92xx_read_reg, (0644), NULL, max92xx_i2c_read_store);
static DEVICE_ATTR(max92xx_write_reg, (0644), NULL, max92xx_i2c_write_store);static struct attribute *max92xx_attributes[] = {&dev_attr_reg.attr,&dev_attr_reg_single.attr,&dev_attr_max92xx_read_reg.attr,&dev_attr_max92xx_write_reg.attr,NULL
};static struct attribute_group max92xx_attr_group = {.attrs = max92xx_attributes,
};static int max92xx_probe(struct i2c_client *client,const struct i2c_device_id *id)
{int retval = 0;int enable_gpio;static struct kobject *max92xx_kobj;max92xx_data.i2c_client = client;if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {dev_err(&client->dev, "I2C not supported\n");return -ENODEV;}if(check_chip_existence() == false){pr_err("%s:no chip is found\n", __func__);return -EIO;}else{pr_info("%s:chip is found\n", __func__);}printk("max9283 enable gpio_requeset\n");enable_gpio = of_get_named_gpio(client->dev.of_node, "qcom,max9283_enable-gpio",0); if (enable_gpio < 0)printk("max9283 enable gpio is not available \n");retval = gpio_request(enable_gpio,"max9283_enable");if(0 != retval) {printk("gpio request %d failed.\n",enable_gpio);}gpio_direction_output(enable_gpio,1);msleep(1000);retval = init_max92xx();if(retval != 0)return -EIO;max92xx_kobj = kobject_create_and_add("max9283", kernel_kobj);if(!max92xx_kobj)return -ENOMEM;retval = sysfs_create_group(max92xx_kobj, &max92xx_attr_group);if (retval) {kobject_put(max92xx_kobj);}return 0;
}static int max92xx_remove(struct i2c_client *client)
{return 0;
}/*!* max92xx init function.* Called on insmod.** @return    Error code indicating success or failure.*/
static __init int max92xx_init(void)
{u8 err = 0;/* Tells the i2c driver what functions to call for this driver. */err = i2c_add_driver(&max92xx_i2c_driver);if (err != 0)pr_err("%s:driver registration failed, error=%d\n",__func__, err);return err;
}/*!* max92xx cleanup function.* Called on rmmod.** @return     Error code indicating success or failure.*/
static void __exit max92xx_clean(void)
{i2c_del_driver(&max92xx_i2c_driver);
}module_init(max92xx_init);
module_exit(max92xx_clean);MODULE_AUTHOR("PATEO maze");
MODULE_DESCRIPTION("max92xx GMSL1 DSI Serializer/DESerializer driver");
MODULE_LICENSE("GPL");

kernel:max92xx加串解串示例代码[可读取16位寄存器地址]相关推荐

  1. java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)

    首先看一下官方文档 地址:微信小程序官方文档API登录接口 我们先对官方给的时序图进行简单的分析 1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.req ...

  2. JAVA包装类及自动封包解包示例代码

    在学习上是一个知识点,但不知如何与实际串起来... 悲哀,真是悲哀!!! 代码: 1 public class Wrapper { 2 public static void main(String[] ...

  3. android 进度条 代码,Android 进度条使用详解及示例代码

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...

  4. c语言生成随机坐标,C语言 文件的随机读写详解及示例代码

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读 ...

  5. java中let_java Signleton模式详解及示例代码

    Singleton模式是创建模式. 这种模式只涉及一个类是负责创建自己的对象. 该类确保只有一个对象获得创建. 这个类提供了一种方法来访问它的唯一对象. 例如,当设计一个用户界面,我们只能有一个主应用 ...

  6. Android运行ListView的代码,Android ListView组件详解及示例代码

    Android 列表组件 ListView 列表组件是开发中经常用到组件,使用该组件在使用时需要为它提供适配器,由适配器提供来确定显示样式和显示数据. 下面看一个例子: 新建一个项目Lesson8_L ...

  7. Android 6种触摸事件,Android 的触摸事件详解及示例代码

    由于触摸(Touch)而触发的事件 Android的事件:onClick, onScroll,onFling等等,都是由许多个Touch组成的.其中Touch的第一个状态肯定是ACTION_DOWN, ...

  8. 联邦学习(Federated Learning)详解以及示例代码

    联邦学习也称为协同学习,它可以在产生数据的设备上进行大规模的训练,并且这些敏感数据保留在数据的所有者那里,本地收集.本地训练.在本地训练后,中央的训练协调器通过获取分布模型的更新获得每个节点的训练贡献 ...

  9. ROS中的多坐标变换详解(示例+代码)

    目录 坐标变换的数学基础 多坐标变换与静态/动态坐标变换的不同之处 tf坐标转换的实质 多坐标变换 静态/动态坐标变换 坐标系相对关系的发布 命令行形式:another_static_pub.laun ...

最新文章

  1. Android内存管理
  2. tomcat runing on daemon with apr and ssl mode
  3. 加密解密php,2个比较经典的PHP加密解密函数分享
  4. css : 使用浮动实现左右各放一个元素时很容易犯的错误
  5. g++编译时的常用选项说明
  6. Frequent values【线段树】
  7. python qt 按钮_PyQt(Python+Qt)学习随笔:toolButton的popupMode属性
  8. Axure高保真学校后台管理作品管理教师管理资源审核学生管理家长管理权限管理资源管理web端后台模板管理教师审核统计分析教育后台管理系统学校后台管理系统校园后台管理系统
  9. Vue.js组件的重要选项
  10. kafka retries参数入门
  11. Linux 学习笔记 二
  12. windows2008系统缓存修改
  13. Oracle物化视图的一般使用【转】
  14. 数据库(基础SQL)
  15. linux学习:图书管理系统
  16. 精灵图(雪碧图)一招解决定位难问题,再也不用猜位置或者ps测距离了
  17. 小米路由器wifi显示无法连接服务器,小米路由器登录地址打不开怎么办?
  18. Bootstrap实战 - 注册和登录
  19. Windos下安装Truffle报错install the latest version of Visual Studio
  20. mvn找不到:log4j:log4j:1.2.17或者导入org.apache.log4j.Logger出现错误的原因和解决办法

热门文章

  1. 比特元BTY简介:老牌加密数字货币,3.0主网成功,新篇章开启!
  2. 从RDR2游戏看DX12和RTX光线追踪的尴尬
  3. 多功能GPS面积测量仪(测亩仪)技术讲座系列之距离测量的算法研究及实现
  4. 2018年中国计算机世界排名,2018全球计算机与工程学科排名:中国9个学科世界第一!清华全球第7...
  5. unity3d学习笔记-着色器(4.一些贴图)
  6. 天正怎么批量填充柱子_天正CAD里面关于 墙体和柱子的填充 卫生隔断没有填充 应该怎么设置...
  7. (九)海哇VR全景电商平台-“商家入驻、我要开店”模块设计分析
  8. 分享6款优秀的 AR/VR 开源库
  9. 记事本写html插入本地图片,Mark记事本 - 支持Markdown写作的图文记事本
  10. 基于微信小程序的校园缴费系统