首页 > 系统相关 >linux的lcd驱动(framebuffer)---点屏

linux的lcd驱动(framebuffer)---点屏

时间:2024-08-21 19:04:43浏览次数:11  
标签:struct 点屏 int OLED --- spi lcd gpio

一.设定屏幕参数

1.更改设备树下的lcd节点参数
目录:arch/arm/boot/dts/imx6ull-14x14-nand-7-1024x600-c.dts

点击查看代码
&i2c2 {
	goodix_ts@5d {
		reg = <0x5d>;
	};
};

&lcdif {
	display0: display {
		bits-per-pixel = <32>;//16
		bus-width = <24>;

		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <35000000>;/*35000000*/
			hactive = <720>;
			vactive = <720>;
			hfront-porch = <46>;
			hback-porch = <44>;
			hsync-len = <2>;
			vback-porch = <16>;//min: 12   zsq_normal:16       18
			vfront-porch = <50>;//zsq_normal: 50        16
			vsync-len = <5>;//zsq_normal 5				2

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <1>;
			};
		};
	};
};

2.在设备树下增加模拟spi的设备节点
目录:arch/arm/boot/dts/imx6ull-14x14-evk.dts

点击查看代码
gpiomnspis {
 			#address-cells = <1>;
 			#size-cells = <1>;
 			compatible = "atkalpha-gpiomnspis";
 			pinctrl-names = "default";
 			pinctrl-0 = <&pinctrl_gpio_mnspis>;
 			cs-gpio = <&gpio1 20 GPIO_ACTIVE_LOW>;			//uart2-tx
			gpio-sck = <&gpio1 21 0>;						//uart2-rx
			gpio-mosi = <&gpio1 23 0>;						//rts
 			status = "okay";
 	};

3.在屏幕驱动的probe函数下,对屏幕进行初始化
目录:/drivers/video/fbdev/mxsfb.c

3.1首先找到"mxsfb_probe"函数,做如下处理

点击查看代码
static int mxsfb_probe(struct platform_device *pdev)
{
	const struct of_device_id *of_id =
			of_match_device(mxsfb_dt_ids, &pdev->dev);
	struct resource *res;
	struct mxsfb_info *host;
	struct fb_info *fb_info;
	struct pinctrl *pinctrl;
	int irq = platform_get_irq(pdev, 0);
	int gpio, ret;
	lcd_spiinit();        //add lcd_spiinit() by me
	if (of_id)
		pdev->id_entry = of_id->data;

	gpio = of_get_named_gpio(pdev->dev.of_node, "enable-gpio", 0);
	if (gpio == -EPROBE_DEFER)
		return -EPROBE_DEFER;
    ...
}

3.2lcd初始化代码如下

点击查看代码
void lcd_spiinit(void)
{
	gpio_lcd_spi.nd = of_find_node_by_path("/gpiomnspis");
	gpio_lcd_spi.cs_gpio = of_get_named_gpio(gpio_lcd_spi.nd, "cs-gpio", 0);
	gpio_lcd_spi.gpio_mosi = of_get_named_gpio(gpio_lcd_spi.nd, "gpio-mosi", 0);
	gpio_lcd_spi.gpio_sck = of_get_named_gpio(gpio_lcd_spi.nd, "gpio-sck", 0);
	gpio_direction_output(gpio_lcd_spi.cs_gpio, 1);
	gpio_direction_output(gpio_lcd_spi.gpio_mosi, 1);
	gpio_direction_output(gpio_lcd_spi.gpio_sck, 1);
		  
    Wrt_Reg_3052(0xFF,0x30);
	Wrt_Reg_3052(0xFF,0x52);
	Wrt_Reg_3052(0xFF,0x01);
	Wrt_Reg_3052(0xE3,0x00);
	Wrt_Reg_3052(0x0A,0x01);
	Wrt_Reg_3052(0x23,0xA0);//A2
    ...
}
点击查看代码
struct gpio_lcd_spi_dev{
	dev_t devids; /* 设备号 */
	//struct cdev cdev; /* cdev */
	struct class *class; /* 类 */
	struct device *device; /* 设备 */
	int major; /* 主设备号 */
	int minor; /* 次设备号 */
	struct device_node *nd; /* 设备节点 */
	int cs_gpio; /* led 所使用的 GPIO 编号 */
	int gpio_mosi;
	int gpio_sck;
};
static	struct gpio_lcd_spi_dev gpio_lcd_spi;

#define	OLED_MOSI_SET()  gpio_set_value(gpio_lcd_spi.gpio_mosi, 1);	 
#define	OLED_MOSI_CLR()  gpio_set_value(gpio_lcd_spi.gpio_mosi, 0);
#define	OLED_CLK_SET()   gpio_set_value(gpio_lcd_spi.gpio_sck, 1);
#define	OLED_CLK_CLR()   gpio_set_value(gpio_lcd_spi.gpio_sck, 0);
#define OLED_CS_Clr()  	 gpio_set_value(gpio_lcd_spi.cs_gpio, 0);
#define OLED_CS_Set()  	 gpio_set_value(gpio_lcd_spi.cs_gpio, 1);

static void SPI_WriteByte1(uint8_t Data)
{
	unsigned char i=0;
	for(i=8;i>0;i--)
	{
		OLED_CLK_CLR();    //将时钟拉低拉高  
	  	if(Data&0x80)	
		{
			OLED_MOSI_SET(); //写数据1
    	}
		else
		{
			OLED_MOSI_CLR(); //写数据0
	  	}
    	OLED_CLK_SET();    //发送1bit数据
    	Data<<=1;
		//usleep(1000);
		//mdelay(1); 
	}
}
void Wrt_Reg_3052(uint8_t dat,uint8_t cmd)
{
	
	OLED_CS_Clr();
	OLED_CLK_CLR();    //将时钟拉低拉高  
	OLED_MOSI_CLR();   
    OLED_CLK_SET();    //发送1bit数据
	SPI_WriteByte1(dat);
	OLED_CLK_CLR();    //将时钟拉低拉高  
	OLED_MOSI_SET();
	OLED_CLK_SET();
	SPI_WriteByte1(cmd);
	OLED_CS_Set();
}

void lcd_spiinit(void)
{
	gpio_lcd_spi.nd = of_find_node_by_path("/gpiomnspis");

标签:struct,点屏,int,OLED,---,spi,lcd,gpio
From: https://www.cnblogs.com/Charles-Hui/p/18372340

相关文章

  • SSUD71-101 Understanding Buildings 241
    SSUD71-101Understanding Buildings241:Assignment2Topic: Assignment2:Group project requiring application ofconstructionprocesses/methods.Format:Part 1:Siteand HouseSummaryPart2: Detailed RoomConstructionSchedulePart3:Construction......
  • 基于SpringBoot+Vue的实验室排课系统设计与实现(2025年毕业项目-源码+论文+部署讲解等)
    文章目录1.前言2.详细视频演示3.论文参考4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.作者推荐项目12.为什么选择我?13.获取源......
  • 基于Java的志愿者管理系统设计与实现(适用于2025年毕业项目-源码+论文+部署讲解等)
    文章目录1.前言2.详细视频演示3.论文参考4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.作者推荐项目12.为什么选择我?13.获取源......
  • 软件测试-web端测试-代码起步
    记录学习笔记第一步、导包web自动化测试常用selenium,这是必要的。fromseleniumimportwebdriver 第二步、确定要使用的浏览器浏览器有很多,常用Chrome,这里看你下载的webdriver是谁的,我用的是edge。用谷歌,那就把Edge改为Chrome,用火狐就改为Firefoxdriver=webdriver.Ed......
  • 软件测试-web自动化测试-前期环境搭建
    记录学习笔记web端自动化测试也就是网页自动化测试。主要在PyCharm软件里编写代码,前期需要准备python+selenium的基础环境搭建。1、下载安装python,下载最新版检查环境:在cmd里python -v和pip -v可以正常出现。√2、PyCharm安装,下载社区免费版直接next安装即可,打开软......
  • sqlilabs less16-20关手工注入
    第16关一.判断闭合方式闭合方式点“)admin")and1=1#二.判断数据库长度admin")andif(length(database())>7,0,sleep(5))#页面无延迟 admin")andif(length(database())>8,0,sleep(5))# 页面有延迟说明数据库长度为8三.判断数据库的第一个字符admin")and......
  • POLIR-Society-Organization-Management:Transform Business Skills with Proven Simu
    CapsimManagementSimulations,Inc.PrivacyPolicyTermsAccessibilityPolicyTransformBusinessSkillswithProvenSimulationandAssessmentTechnologyProvideimmersive,hands-onlearningexperiencesinareal-worldenvironment–soyoucanmeasureand......
  • 信息学奥赛初赛天天练-71-NOIP2016普及组-基础题2-进制转换、二进制转八进制、八进制
    NOIP2016普及组基础题24以下不是CPU生产厂商的是()AIntelBAMDCMicrosoftDIBM8与二进制小数0.1相等的八进制数是()A0.8B0.4C0.2D0.19以下是32位机器和64位机器的区别是()A显示器不同B硬盘大小不同C寻址......
  • 最短路 - Dijkstra 算法
    Dijkstra(迪杰斯特拉)算法是基于贪心思想的单源最短路算法暴力Dijkstra具体如下:structnode{ intv,w;};vector<node>e[N];intdist[N],vis[N];e[u]存的是节点u的所有出边的终点和边权,dist[u]存u到原点s的最小距离,vis[u]标记是否走过voiddijkstra(int......
  • 华为OD机试 - 密码输入检测 字符串
    只在本地跑过,不确保一定对#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<string.h>#definesetbit(value,bit)(value=value|(1<<bit))intmain(void){charbuf[201];charout[201];inti=0;int......