一:设备树修改:
路径:/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 *