草庐IT

【f1c200s/f1c100s】RGB接口 LCD驱动适配

Liangtao` 2023-04-21 原文

【f1c200s/f1c100s】RGB接口 LCD驱动适配

RGB模式介绍

RGB 模式就是我们通过说的 RGB 屏,以 RGB(TTL 信号)并行数据线传输,广泛的应用于 5 寸及以上的 TFT-LCD 中。引脚包含RGB数据+时钟+控制引脚;数据位数可为:RGB565、RGB666、RGB888,数据位树越多,颜色失真就越少。

信号线描述
R[7:0]8 根红色数据线
G[7:0]8 根绿色数据线
B[7:0]8 根蓝色数据线
DE数据使能线
VSYNC垂直同步信号线
HSYNC水平同步信号线
PCLK像素时钟信号线

由于每一块屏幕分辨率、时序参数不一样(其实差距不大,所以参数有时候设置不完全正确也能点亮屏幕),每一块屏幕的参数都必须重新配置。幸运的是,linux内核已经适配了RGB模式下的LCD驱动(见drivers/gpu/drm/panel/panel-simple.c),我们不需要从零写一个屏幕驱动,所以我们只需要简单几步即可驱动LCD屏幕。

F1C200s/F1C100s RGB LCD驱动适配

基于的硬件为自己设计的Mangopi和正点原子7寸LCD显示屏,分辨率为840x480。
软件在荔枝派官方代码基础上进行修改。

设备树修改

suniv-f1c100s.dtsi中将连接LCD的引脚复用为lcd功能:

pio: pinctrl@1c20800 {
			compatible = "allwinner,suniv-f1c100s-pinctrl";
			reg = <0x01c20800 0x400>;
			interrupts = <38>, <39>, <40>;
			clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
			clock-names = "apb", "hosc", "losc";
			gpio-controller;
			interrupt-controller;
			#interrupt-cells = <3>;
			#gpio-cells = <3>;

			uart0_pe_pins: uart0-pe-pins {
				pins = "PE0", "PE1";
				function = "uart0";
			};

			uart1_pe_pins: uart1-pe-pins {
				pins = "PA2", "PA3";
				function = "uart1";
			};
			//复用LCD为模式
			lcd_rgb666_pins: lcd-rgb666-pins {
				pins = "PD0", "PD1", "PD2", "PD3", "PD4",
				       "PD5", "PD6", "PD7", "PD8", "PD9",
				       "PD10", "PD11", "PD12", "PD13", "PD14",
				       "PD15", "PD16", "PD17", "PD18", "PD19",
				       "PD20", "PD21";
				function = "lcd";
			};
			
			mmc0_pins: mmc0-pins {
				pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5";
				function = "mmc0";
			};

			key_pins: key_pins {
				pins = "PA0", "PA1";
				function = "gpio_in";
			};

			i2c0_pins: i2c0_pins {
				pins = "PE11", "PE12";
				function = "i2c0";
			};
		};

suniv-f1c100s-licheepi-nano.dts中修改后的panel节点如下,其中compatible 属性增加了alientek,alientek_7_inch,是为了适配驱动代码中的相应屏幕的配置。

panel: panel {
		compatible = "alientek,alientek_7_inch", "simple-panel";
		#address-cells = <1>;
		#size-cells = <0>;
		reset-gpios = <&pio 4 4 GPIO_ACTIVE_LOW>;//复位引脚
		power-supply = <&reg_vcc3v3>;
 		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;
 			panel_input: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&tcon0_out_lcd>;
			};
		};
	};

源码修改

drivers/gpu/drm/panel/panel-simple.c文件中存在非常多厂家的屏幕参数,如:

我们要做的就是在这个文件里面,仿照这些预设的参数添加我们自己的屏幕参数。
大约在2560行左右仿照上面预设的屏幕参数添加自己屏幕的时序信息,时序信息的具体含义可以参考:
Documentation/devicetree/bindings/display/panel/display-timing.txtinclude/drm/drm_modes.hRBG LCD时序参考以及自己屏幕的数据手册。

static const struct drm_display_mode alientek_7_inch_mode = {
	.clock = 51200,
	.hdisplay = 800,
	.hsync_start = 800+20,
	.hsync_end = 800 + 20 + 160,
	.htotal = 800 + 20 + 140 + 160,
	.vdisplay = 480,
	.vsync_start = 480 + 3,
	.vsync_end = 480 + 3 + 12,
	.vtotal = 480 + 3 + 12 + 20,
	.vrefresh = 60,
};

static const struct panel_desc alientek_7_inch = {
	.modes = &alientek_7_inch_mode,
	.num_modes = 1,
	.bpc = 6,
	.size = {
		.width = 154,
		.height = 85,
	},
};

然后在大约2860行左右,添加屏幕的适配信息,其中的compatible 属性需要和设备树panel中的一致。

 	{
		.compatible = "winstar,wf35ltiacd",
		.data = &winstar_wf35ltiacd,
	}, {
		.compatible = "alientek,alientek_7_inch",  //自己添加的,需要和设备树一致
		.data = &alientek_7_inch, //自己添加的
	}, {  //末尾为空结构体,不能删除
		/* sentinel */
	}

然后在menuconfig中配置打开linux logo,保存编译。

-> Device Drivers
	 -> Graphics support 
		 -> Bootup logo (LOGO [=y]) 
		 	-> Standard black and white Linux logo 
		 	-> Standard 16-color Linux logo 
		 	-> Standard 224-color Linux logo

结果

不出意外在内核启动时可以看到屏幕左上角上有小企鹅logo,进入系统后可以在/dev目录下找到fb0设备。有了这个framebuffer设备之后,就可以使用lvgl或者awtk等GUI库编写漂亮的界面了。

用lvgl简单写了个测试屏幕的demo:

有关【f1c200s/f1c100s】RGB接口 LCD驱动适配的更多相关文章

  1. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  2. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  3. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  4. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  5. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  6. ruby-on-rails - 计算数组中的项目跨越数千条记录的 100 条 - 2

    我有一个带有Postgres数据库的Rails应用程序,该数据库有一个带有jsonbgenres列的Artists表。有几十万行。该行中的每个流派列都有一个类似["rock","indie","seenlive","alternative","indierock"]的数组,其中包含不同的流派。我想要做的是在所有行中以JSON格式输出每种类型的计数。类似于:{"rock":532,"powermetal":328,"indie":862}有没有办法有效地做到这一点?更新...这是我目前得到的...genres=Artist.all.pluck(:genres).flatten.delet

  7. ruby - 运行测试时静音 Chrome 驱动程序控制台输出 - 2

    我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8)。但是当我在Ruby中使用以下代码运行示例测试时:require'selenium-webdriver'WAIT=Selenium::WebDriver::Wait.new(timeout:100)$driver=Selenium::WebDriver.for:chrome$driver.manage.window.maximize$driver.navigate.to'https://www.google.co.in'defapps_hoverele_hover=$driver.find_

  8. ruby-on-rails - 我应该使用哪个适用于 Ruby 的 CouchDB 适配器? - 2

    一些我找到的选项是ActiveCouchCouchRESTCouchPotatoRelaxDBcouch_foo我更喜欢GitHub上的项目,因为这让我更容易fork和推送修复。所有这些都符合该要求。我习惯了Rails,所以我喜欢像ActiveRecord模型一样工作的东西。另一方面,我也不希望我和Couch之间太多--毕竟我使用它作为我的数据库是有原因的。最后,它们似乎都得到了相当积极的维护(couch_foo可能是个异常(exception))。所以我想这归结为(不可否认和不幸的)主观:有没有人对他们有过好的或坏的经历? 最佳答案

  9. ruby-on-rails - Rails 在记录 200 OK 后在做什么? (调试响应时间慢) - 2

    我试图在我的RubyonRails应用程序中调试一个极其缓慢的请求调用。我已设法根据自己的喜好优化Controller方法,Rails的日志告诉我它已在XX毫秒内完成操作(Completed200OKin5049ms(Views:34.9ms|ActiveRecord:76.3ms)).但是,在加载页面时,在浏览器中实际呈现任何内容之前打印此消息很长;最多约15秒的等待时间。Rackmini-profiler证实了这一点,告诉我GET操作(不计算完成Controller操作所花费的时间)花费了14秒左右。(分析器还确认Controller操作的执行时间约为5秒)。我可以接受Contro

  10. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

随机推荐