hi3516dv300驱动OLED

一:设备树修改:

路径:/home/alientek/hi3516/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/kernel/linux-4.9.y/arch/arm/boot/dts下的hi3516dv300-demb.dtb文件

在i2c1中追加oled节点。oled设备地址应为0x78 = 0111 1000 。linux中i2c地址只有7位,应该为 011 1100 =0x3c 。 在i2c1中追加oled节点。

- 接口:4针i2c

- 供电:3.3-5v

- 像素:128*64

- 体积:27*27*2

- ic:SSD1306

- 地址:0x3c(手册中0x78,实际0x3c)

 使用的引脚为:位于II2C总线3上,引脚24和26

 二:驱动分析

仿照STM32单片机中的OLED程序,主要是读写命令

void WriteCmd(unsigned char I2C_Command)//写命令
{
	HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,&I2C_Command,1,100);
}

void WriteDat(unsigned char I2C_Data)//写数据
{
	HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,&I2C_Data,1,100);
}

修改为以下函数,0x40是写数据,0x00为写命令,在头文件里定义了两个

#define OLED_CMD  0

#define OLED_DATA 1

当mod为OLED_CMD则为写命令,为OLED_DATA时是写数据。

static s32 oled12864_write_regs(struct oled12864_dev *dev, u8 reg, u8 *buf, u8 len)
{
	u8 b[256];
	struct i2c_msg msg;
	struct i2c_client *client = (struct i2c_client *)dev->private_data;
	
	b[0] = reg;					/* 寄存器首地址 */
	memcpy(&b[1],buf,len);		/* 将要写入的数据拷贝到数组b里面 */
		
	msg.addr = client->addr;	/* oled12864地址 */
	msg.flags = 0;				/* 标记为写数据 */

	msg.buf = b;				/* 要写入的数据缓冲区 */
	msg.len = len + 1;			/* 要写入的数据长度 */

	return i2c_transfer(client->adapter, &msg, 1);
}

static void oled12864_write_onereg(struct oled12864_dev *dev, u8 reg, u8 data)
{
	u8 buf = 0;
	buf = data;
	oled12864_write_regs(dev, reg, &buf, 1);
}

void OLED_WR_Byte(u8 data, u8 mode)
{
	u8 buf[2] = {};
	if(mode){
		buf[0] = 0x40;
	}else{
		buf[0] = 0x00;
	}
	buf[1] = data;
	oled12864_write_onereg(&oled12864dev, buf[0], buf[1]);
}

 三:驱动程序

以下为驱动程序oeld_driver.c

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/i2c.h>
#include <linux/fs.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "oled.h"
#include "oledfont.h"
#include "oled12864.h"

#define OLED12864_CNT	1
#define OLED12864_NAME	"oled12864"

struct oled12864_dev {
	dev_t devid;				/* 设备号 	 */
	struct cdev cdev;			/* cdev 	*
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值