代码编织梦想

OLED驱动

本文使用的是i2c驱动的OLED

【LicheePi-dock】在linux上写了个BUG(oled驱动

修改设备树

设备树地址:/home/bango/tina-d1-h/device/config/chips/d1-h/configs/nezha/board.dts
sudo gedit /home/bango/tina-d1-h/device/config/chips/d1-h/configs/nezha/board.dts
看原理图发现i2c-2有引出,添加i2c的配置:

	oled@3c {
			compatible = "oled,SSD1306";
			status = "okay";
			reg = <0x3c>;
	};

向内核添加驱动

1.找到一个合适的位置,创建oled驱动文件:

我选择~/tina-d1-h/lichee/linux-5.4/drivers/misc

touch oled.c
gedit oled.c
touch oledfont.h
gedit oledfont.h

添加驱动代码:

#include <linux/ide.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include "oledfont.h"

struct class *oled_class;    /* 类 		*/
int oled_major;              /* 主设备号 */
struct i2c_client *oled_client;

static char buf_dev[100]= "DataOfKernel";
unsigned char str_count = 0;	//The count of String, display for oled
unsigned char y_value = 0;	//The value of current y-page value
// 构造i2c_msg通过这个client调用i2c_tansfer来读写
static int oled_write_reg(unsigned char addr,unsigned char cmd)
{
  int ret = -1;
  unsigned char data[2]={0};
  if(cmd==1){
  	data[0]=0x00;
  }else{
  	data[0]=0x40;
  }
  data[1]=addr;
  struct i2c_msg msgs;
  

  //printk("oled_client -> addr=%d\n", oled_client->addr);
  //printk("data[0]=%d\n", data[0]);
  //printk("data[1]=%d\n", data[1]);
  msgs.addr = oled_client->addr; //   OLED_ADDR,直接封装于i2c_msg
  msgs.buf = data;
  msgs.len = 2;   //长度1 byte
  msgs.flags = 0; //表示写

  ret = i2c_transfer(oled_client->adapter, &msgs, 1); 
  //这里都封装好了,本来根据i2c协议写数据需要先写入器件写地址,然后才能读
  if (ret < 0)
  {
      printk("i2c_transfer write err\n");
      return -1;
  }
  return 0;
}

static int oled_init_reg(void)
{
  //The list of oled-reg for init display
  oled_write_reg(0xAE, 1);
  oled_write_reg(0x00, 1);
  oled_write_reg(0x10, 1);
  oled_write_reg(0x40, 1);
  oled_write_reg(0xB0, 1);
  oled_write_reg(0x81, 1);
  oled_write_reg(0xFF, 1);
  oled_write_reg(0xA1, 1);
  oled_write_reg(0xA6, 1);
  oled_write_reg(0xA8, 1);
  oled_write_reg(0x3F, 1);
  oled_write_reg(0xC8, 1);
  oled_write_reg(0xD3, 1);
  oled_write_reg(0x00, 1);
  oled_write_reg(0xD5, 1);
  oled_write_reg(0x80, 1);
  oled_write_reg(0xD8, 1);
  oled_write_reg(0x05, 1);
  oled_write_reg(0xD9, 1);
  oled_write_reg(0xF1, 1);
  oled_write_reg(0xDA, 1);
  oled_write_reg(0x12, 1);
  oled_write_reg(0xDB, 1);
  oled_write_reg(0x30, 1);
  oled_write_reg(0x8D, 1);
  oled_write_reg(0x14, 1);
  oled_write_reg(0xAF, 1);
  
  return 0;
  
}
/************************************************************funtion_of_oled************************************************/
//funtion for draw a point in the oled-screen
static void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 	oled_write_reg(0xb0+y, 1);
  oled_write_reg(((x&0xf0)>>4)|0x10, 1);
  oled_write_reg((x&0x0f), 1);
} 


/*static int oled_read_reg(unsigned char *buf)
{
  int ret = -1;
  struct i2c_msg msg;
  msg.addr = oled_client->addr; // OLED_ADDR
  msg.buf = buf;
  msg.len = 2;                                            //长度1 byte
  msg.flags = I2C_M_RD;                                   //表示读
  ret = i2c_transfer(oled_client->adapter, &msg, 1); //这里都封装好了,本来根据i2c协议读数据需要先写入读地址,然后才能读
  if (ret < 0)
  {
      printk("i2c_transfer write err\n");
      return -1;
  }
  return 0;
}*/
static void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
{      	
  unsigned char c=0,i=0;	
  	c=chr-' ';//得到偏移后的值			
  	if(x>128-1){x=0;y=y+2;}
  	if(Char_Size ==16)
  		{
  		OLED_Set_Pos(x,y);	
  		for(i=0;i<8;i++)
  		 oled_write_reg(F8X16[c*16+i],0);
  		OLED_Set_Pos(x,y+1);
  		for(i=0;i<8;i++)
  		 oled_write_reg(F8X16[c*16+i+8],0);
  		}
  		else {	
  			OLED_Set_Pos(x,y);
  			for(i=0;i<6;i++)
  			 oled_write_reg(F6x8[c][i],0);
  			
  		}
}
  			  
//m^n函数
static unsigned char oled_pow(unsigned char m,unsigned char n)
{
  unsigned char result=1;	 
  while(n--)result*=m;    
  return result;
}				  
//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);
   		  
static void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size2)
{         	
  unsigned char t,temp;
  unsigned char enshow=0;						   
  for(t=0;t<len;t++)
  {
  	temp=(num/oled_pow(10,len-t-1))%10;
  	if(enshow==0&&t<(len-1))
  	{
  		if(temp==0)
  		{
  			OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  			continue;
  		}else enshow=1; 
  	 	 
  	}
   	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
  }
} 

static void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size)
{
  unsigned char j=0;
  while (chr[j]!='\0')
  {		OLED_ShowChar(x,y,chr[j],Char_Size);
  		x+=8;
  	if(x>120){x=0;y+=2;}
  		j++;
  }
}

/********************************************
// Clean
********************************************/
static void fill_picture(unsigned char fill_Data)
{
  unsigned char m,n;
  for(m=0;m<8;m++)
  {
  	oled_write_reg(0xb0+m,1);		//page0-page1
  	oled_write_reg(0x00,1);		//low column start address
  	oled_write_reg(0x10,1);		//high column start address
  	for(n=0;n<128;n++)
  	{
  			oled_write_reg(fill_Data,0);
  	}
  }
}	

static ssize_t oled_show_str(struct file *file, const char __user *buf, size_t count, loff_t *off)	
{
  unsigned char err;
  str_count++;
  y_value = (str_count-1)*2;
  	printk("write to oled_\n");
  err = copy_from_user(buf_dev, buf, count);
  if(err<0){
  	printk("write fail?!\r\n");
  }
  OLED_ShowString(0, y_value, buf_dev, 16);
  if(str_count>4)
  {
  	
  	
  	
  	fill_picture(0x00);   //Clean the screen
  	str_count = 0;
  	OLED_ShowString(0, y_value, buf_dev, 16); 	//Set Display
  }
  
  return 1;
}
  
// 初始OLED
int oled_open(struct inode *inode, struct file *file)
{
  printk("open oled_\n");
  
  fill_picture(0x00);
  return 0;
}


/*******************************************************************************************************/
/* oled 操作函数 */
static const struct file_operations oled_fops = {
  .owner = THIS_MODULE,
  .open = oled_open, 
  .write = oled_show_str
};

/* 构造一个platform_driver,
其中的of_match_table字段需要与 light-sensor@23 节点的compatible属性值一致,
当匹配时则调用platform_driver的probe函数 */
static const struct of_device_id ids[] =
{
  {.compatible = "oled,SSD1306"},
  {  }
};

// 在i2c_driver的probe函数中得到在总线驱动程序中解析得到的i2c_client,
// 并为该oeld注册一个字符设备
static int oled_probe(struct i2c_client *client,
                         const struct i2c_device_id *id)
{
  oled_client = client;

  printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
  oled_major = register_chrdev(0, "oled", &oled_fops);
  oled_class = class_create(THIS_MODULE, "oled");
  device_create(oled_class, NULL, MKDEV(oled_major, 0), NULL, "oled"); /* /dev/oled */
  oled_init_reg();
  fill_picture(0x00);
  OLED_ShowString(2,1,"OLED driver",16);
  OLED_ShowString(16,5,"power by BanGO",8);
  return 0;
}

// 在platform_driver的remove函数中,注销该字符设备
static int oled_remove(struct i2c_client *client)
{
  device_destroy(oled_class, MKDEV(oled_major, 0));
  class_destroy(oled_class);
  unregister_chrdev(oled_major, "oled");

  return 0;
}

/* 分配/设置i2c_driver */
static struct i2c_driver oled_driver = {
  .driver = {
      .name = "SSD1306",
      .owner = THIS_MODULE,
      .of_match_table = ids,
  },
  .probe = oled_probe,
  .remove = oled_remove,
};

/*
* @description	: 驱动入口函数
*/
static int __init oled_init(void)
{
  int ret = 0;

  ret = i2c_add_driver(&oled_driver);
  return ret;
}

/*
* @description	: 驱动出口函数
*/
static void __exit oled_exit(void)
{
  i2c_del_driver(&oled_driver);
}

/* module_i2c_driver(bh1750_driver) */
module_init(oled_init);
module_exit(oled_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("BanGO");

添加字库代码:

#ifndef __OLEDFONT_H
#define __OLEDFONT_H 	

#include <linux/types.h>   
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
/************************************6*8的点阵************************************/
const unsigned char F6x8[][6] =		
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},// sp
{0x00, 0x00, 0x00, 0x2f, 0x00, 0x00},// !
{0x00, 0x00, 0x07, 0x00, 0x07, 0x00},// "
{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14},// #
{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12},// $
{0x00, 0x62, 0x64, 0x08, 0x13, 0x23},// %
{0x00, 0x36, 0x49, 0x55, 0x22, 0x50},// &
{0x00, 0x00, 0x05, 0x03, 0x00, 0x00},// '
{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00},// (
{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00},// )
{0x00, 0x14, 0x08, 0x3E, 0x08, 0x14},// *
{0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},// +
{0x00, 0x00, 0x00, 0xA0, 0x60, 0x00},// ,
{0x00, 0x08, 0x08, 0x08, 0x08, 0x08},// -
{0x00, 0x00, 0x60, 0x60, 0x00, 0x00},// .
{0x00, 0x20, 0x10, 0x08, 0x04, 0x02},// /
{0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
{0x00, 0x00, 0x42, 0x7F, 0x40, 0x00},// 1
{0x00, 0x42, 0x61, 0x51, 0x49, 0x46},// 2
{0x00, 0x21, 0x41, 0x45, 0x4B, 0x31},// 3
{0x00, 0x18, 0x14, 0x12, 0x7F, 0x10},// 4
{0x00, 0x27, 0x45, 0x45, 0x45, 0x39},// 5
{0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
{0x00, 0x01, 0x71, 0x09, 0x05, 0x03},// 7
{0x00, 0x36, 0x49, 0x49, 0x49, 0x36},// 8
{0x00, 0x06, 0x49, 0x49, 0x29, 0x1E},// 9
{0x00, 0x00, 0x36, 0x36, 0x00, 0x00},// :
{0x00, 0x00, 0x56, 0x36, 0x00, 0x00},// ;
{0x00, 0x08, 0x14, 0x22, 0x41, 0x00},// <
{0x00, 0x14, 0x14, 0x14, 0x14, 0x14},// =
{0x00, 0x00, 0x41, 0x22, 0x14, 0x08},// >
{0x00, 0x02, 0x01, 0x51, 0x09, 0x06},// ?
{0x00, 0x32, 0x49, 0x59, 0x51, 0x3E},// @
{0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C},// A
{0x00, 0x7F, 0x49, 0x49, 0x49, 0x36},// B
{0x00, 0x3E, 0x41, 0x41, 0x41, 0x22},// C
{0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C},// D
{0x00, 0x7F, 0x49, 0x49, 0x49, 0x41},// E
{0x00, 0x7F, 0x09, 0x09, 0x09, 0x01},// F
{0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A},// G
{0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F},// H
{0x00, 0x00, 0x41, 0x7F, 0x41, 0x00},// I
{0x00, 0x20, 0x40, 0x41, 0x3F, 0x01},// J
{0x00, 0x7F, 0x08, 0x14, 0x22, 0x41},// K
{0x00, 0x7F, 0x40, 0x40, 0x40, 0x40},// L
{0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F},// M
{0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F},// N
{0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E},// O
{0x00, 0x7F, 0x09, 0x09, 0x09, 0x06},// P
{0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
{0x00, 0x7F, 0x09, 0x19, 0x29, 0x46},// R
{0x00, 0x46, 0x49, 0x49, 0x49, 0x31},// S
{0x00, 0x01, 0x01, 0x7F, 0x01, 0x01},// T
{0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F},// U
{0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F},// V
{0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F},// W
{0x00, 0x63, 0x14, 0x08, 0x14, 0x63},// X
{0x00, 0x07, 0x08, 0x70, 0x08, 0x07},// Y
{0x00, 0x61, 0x51, 0x49, 0x45, 0x43},// Z
{0x00, 0x00, 0x7F, 0x41, 0x41, 0x00},// [
{0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55},// 55
{0x00, 0x00, 0x41, 0x41, 0x7F, 0x00},// ]
{0x00, 0x04, 0x02, 0x01, 0x02, 0x04},// ^
{0x00, 0x40, 0x40, 0x40, 0x40, 0x40},// _
{0x00, 0x00, 0x01, 0x02, 0x04, 0x00},// '
{0x00, 0x20, 0x54, 0x54, 0x54, 0x78},// a
{0x00, 0x7F, 0x48, 0x44, 0x44, 0x38},// b
{0x00, 0x38, 0x44, 0x44, 0x44, 0x20},// c
{0x00, 0x38, 0x44, 0x44, 0x48, 0x7F},// d
{0x00, 0x38, 0x54, 0x54, 0x54, 0x18},// e
{0x00, 0x08, 0x7E, 0x09, 0x01, 0x02},// f
{0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C},// g
{0x00, 0x7F, 0x08, 0x04, 0x04, 0x78},// h
{0x00, 0x00, 0x44, 0x7D, 0x40, 0x00},// i
{0x00, 0x40, 0x80, 0x84, 0x7D, 0x00},// j
{0x00, 0x7F, 0x10, 0x28, 0x44, 0x00},// k
{0x00, 0x00, 0x41, 0x7F, 0x40, 0x00},// l
{0x00, 0x7C, 0x04, 0x18, 0x04, 0x78},// m
{0x00, 0x7C, 0x08, 0x04, 0x04, 0x78},// n
{0x00, 0x38, 0x44, 0x44, 0x44, 0x38},// o
{0x00, 0xFC, 0x24, 0x24, 0x24, 0x18},// p
{0x00, 0x18, 0x24, 0x24, 0x18, 0xFC},// q
{0x00, 0x7C, 0x08, 0x04, 0x04, 0x08},// r
{0x00, 0x48, 0x54, 0x54, 0x54, 0x20},// s
{0x00, 0x04, 0x3F, 0x44, 0x40, 0x20},// t
{0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C},// u
{0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C},// v
{0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C},// w
{0x00, 0x44, 0x28, 0x10, 0x28, 0x44},// x
{0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C},// y
{0x00, 0x44, 0x64, 0x54, 0x4C, 0x44},// z
{0x14, 0x14, 0x14, 0x14, 0x14, 0x14}// horiz lines
};		
/****************************************8*16的点阵************************************/
const unsigned char F8X16[]=	  
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
  0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
  0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
  0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
  0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
  0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
  0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
  0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
  0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
  0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
  0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
  0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
  0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
  0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
  0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
  0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
  0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
  0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
  0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
  0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
  0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
  0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
  0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
  0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
  0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
  0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
  0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
  0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
  0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
  0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
  0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
  0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
  0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
  0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
  0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
  0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
  0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
  0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
  0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
  0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
  0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
  0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
  0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
  0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
  0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
  0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};	  
unsigned char Hzk[][32]={




};

#endif



修改当前目录下的Kconfig和Makefile

gedit Kconfig

添加:
在这里插入图片描述

gedit Makefile

添加:
在这里插入图片描述

把驱动添加进内核编译

make kernel_menuconfig

在这里插入图片描述

make -j32
pack

生成系统镜像烧录进板子,可以看到oled被点亮:

在这里插入图片描述进入文件系统,在/dev/下能看到oled就说明驱动加载成功了:
在这里插入图片描述

编写应用程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
int main(int argc, char **argv)
{
	int fd;
	char val;
	unsigned char buf[]="1234567890";
	float flight;
	fd = open("/dev/oled", O_RDWR);
	printf("oled init fisih!\n");
	if (fd < 0)
	{
		printf("can't open /dev/gy_sensor\n");
		return -1;
	}
	//usleep(200000);
	switch (argc){
	case 2:
	if (write(fd,argv[1],sizeof(argv[1]))){
	        
	         printf("Oled wirte ok!\r\n");
	     }
	     else{
	         printf("read err!\r\n");
	     }
	 break;
	case 3:
	if (write(fd,argv[2],sizeof(argv[2]))){
	        
		 write(fd,argv[3],sizeof(argv[3]));	        
	         printf("Oled wirte ok!\r\n");
	     }
	     else{
	         printf("read err!\r\n");
	     }
	 case 4:
	if (write(fd,argv[3],sizeof(argv[3]))){
	        
		 write(fd,argv[1],sizeof(argv[1]));
		 write(fd,argv[2],sizeof(argv[2]));	        
	         printf("Oled wirte ok!\r\n");
	     }
	     else{
	         printf("read err!\r\n");
	     }
	 break;
	 case 5:
	 if (write(fd,argv[2],sizeof(argv[2]))){
	        
		 write(fd,argv[3],sizeof(argv[3]));
		 write(fd,argv[4],sizeof(argv[4]));
		 write(fd,argv[5],sizeof(argv[5]));	        
	         printf("Oled wirte ok!\r\n");
	     }
	     else{
	         printf("read err!\r\n");
	     }
	 	break; 
	 default:
	 	printf("input arg num not in 1~4!\r\n");
	 	break;
	 }
		
	return 0;
}

编译我使用的是cmake

在目录下创建CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)

project (OLEDU)
#在CMakeLists.txt一開始加入相關設定:
#告知當前使用的是交叉編譯方式,必須配置
SET(CMAKE_SYSTEM_NAME Linux)
 
#指定C交叉編譯器,必須配置
#或交叉編譯器使用絕對地址
SET(CMAKE_C_COMPILER "/home/bango/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc")

add_executable(oled_test oled_test.c)

注意选择好自己编译链的地址
然后:

cmake 
make 

就可以生成可执行文件到板子运行。
使用方法:

./oled_test BanGO //后面带想要加载的字符
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/linfengXBB/article/details/127940666

ubuntu18.04安装cairo-dock实现炫酷的dock_橘的皮瓜着披。的博客-爱代码爱编程_cairo dock

1、在ubuntu18.04的dock美化过程中试过dash to dock、plank、docky等一系列dock美化工具,最后还是觉得cairo-dock功能较为强大,效果最为炫酷。 2、cairo-dock可在ubu

deepin更新到15.10后任务栏(dde-dock)消失_数学工具构造器的博客-爱代码爱编程

两个提示: libdde-disk-mount-plugin.so 和系统不兼容 libsystem-tray.so 和系统不兼容 在终端运行dde-dock后: “DockPlugin” load plu

deepin(深度linux)dde-dock系统监控小插件(网速cpu内存)_zedpass的博客-爱代码爱编程_dde-dock

转载自deepin(深度linux)dde-dock系统监控小插件(网速CPU内存),仅用作个人学习备份,Mark一下 花了一周时间,研究了dde-dock官方插件开发文档和sonichy大神的项目,自己弄出来一个插件,记

一款类似于mac-dock栏的windows软件_量子孤岛的博客-爱代码爱编程

一款类似于mac-dock栏的windows软件 软件名称叫 Winstep Nexus Ultimate 软件链接如下: 链接:https://www.lanzous.com/i1xnevc 密码:5vsy 安装

linux当前目录改为桌面,Latte Dock 作为一个 KDE 漂亮的桌面面板替换-爱代码爱编程

很少在 KDE 桌面上看到程序应用的停靠程序,现在这一情况即将改变。Latte Dock是KDE新桌面 dock。 它不仅仅是一个应用程序启动器,它还可以作为一个 Plasma 桌面面板的一个替换。 是应用程序“与Qt/Plasma桌面集成,以便你可以完全与KDE默认面板的沟通。还完全支持所有 Plasma 部件。 Github 页面关于Lat

08 arm cortex-a7汇编语言和指令介绍,arm汇编语言名为ual,由编译器指定指令集是arm还是thumb,不同指令集的汇编指令是一样的_才鲸嵌入式的博客-爱代码爱编程

ARM Cortex-A7汇编语言和指令介绍 作者将狼才鲸创建日期2022-11-18 一、Cortex-A7介绍 ARM Cortex-A7是32位CPU核,使用A7的芯片有NXP的i.MX7、博通BCM2836

linux服务器搭建之路8-爱代码爱编程

1. 传统办法: wget http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm rpm -i