SN65DSI83是一个mipi转lvds的单路对单路转换器。-Q1个人认为是车规级产品
#SN65DSI84是mipi转lvds单路对双路转换器
#需要注意的是mipi clock以及lvds clock的计算方法. [github的imx6qp.sh上面有详解https://github.com/mazelinux/PATEO/blob/master/imx/imx6qp_readme.sh]
#一路mipi转两路lvds,需要注意h方向的分辨率:mipi是lvds的两倍.显示部分和隐藏部分均是.
支持I2c 挂载。i2c的从地址通过
将bit1的addr上拉或者下拉来判断.我们的电路图是下拉。所以address是0x58。
bringup的逻辑简单来说分几部分:dts声明设备的存在,对应驱动来驱动设备,硬件上接好设备。
1.dts
&i2c_5 { /* BLSP2 QUP1 */
+ tixx@2c { /*ti csr ic:SN65DSI83-Q1 dsi2lvds*/
+ compatible = "ti,tixx";
+ reg = <0x2c>;
+ };
};
2.驱动
/*!
* @file tixx.c
*
* @brief tixx GMSL1 DSI Serializer 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>
#include <linux/workqueue.h>
#include <linux/jiffies.h>
#include <linux/notifier.h>
#include <linux/mutex.h>
/***********************************************************************
* WORKQUEUE .
***********************************************************************/
//static struct workqueue_struct * queue = NULL;
//static struct delayed_work work;
//static int work_handler(struct work_struct *data);
//static int notifier_handler(void);
extern int mpu_ctrl_dsi84_enable(int enable);
extern int mpu_ctrl_dsi84_show(void); //获取屏幕的lcd_fault脚.用来标识屏幕是否收到lvds的PCLK
extern int mpu_lcd_version_check(void);
//extern int get_wakeup_irq_num(void);
//static int resume_time = 0;
void reset_dsi84(void);
struct sensor {
struct i2c_client *i2c_client;
} tixx_data;
struct mutex dsi84_lock;
/***********************************************************************
* NOFITIER .
***********************************************************************/
//static BLOCKING_NOTIFIER_HEAD(dsi84_reinit_chain);
//static struct notifier_block dsi84_reinit_notifier =
//{
// .notifier_call = notifier_handler,
//};
//int dsi84_reinit_notifier_call_chain(unsigned long val, void *v)
//{
// return blocking_notifier_call_chain(&dsi84_reinit_chain, val, v);
//}
//EXPORT_SYMBOL(dsi84_reinit_notifier_call_chain);
/***********************************************************************
* I2C transfert.
***********************************************************************/
/*! Read one register from a tixx i2c slave device.
*
* @param *reg register in the device we wish to access.
*
* @return 0 if success, an error code otherwise.
*/
static inline int tixx_read_reg(u8 reg)
{
int val;
val = i2c_smbus_read_byte_data(tixx_data.i2c_client, reg);
return val;
}
/*! Write one register of a tixx i2c slave device.
*
* @param *reg register in the device we wish to access.
*
* @return 0 if success, an error code otherwise.
*/
static int tixx_write_reg(u8 reg, u8 val)
{
s32 ret;
ret = i2c_smbus_write_byte_data(tixx_data.i2c_client, reg, val);
if (ret < 0) {
pr_err("%s:write reg er