当前位置: 首页 > news >正文

【milkv】添加LCD屏GC9306

前言

本章介绍如何添加LCD屏GC9306驱动。

电路图

在这里插入图片描述

dts

build\boards\cv180x\cv1800b_milkv_duo_sd\dts_riscv\cv1800b_milkv_duo_sd.dts

&spi2 {status = "okay";/delete-node/ spidev@0;gc9306: gc9306@0{compatible = "sitronix,gc9306";reg = <0>;status = "okay";spi-max-frequency = <48000000>;spi-cpol;spi-cpha;rotate = <90>;fps = <30>;rgb;buswidth = <8>;//dc-gpios = <&port 21 GPIO_ACTIVE_HIGH>;	//DCdc-gpios = <&porta 23 GPIO_ACTIVE_HIGH>;	//DCreset-gpios = <&porta 24 GPIO_ACTIVE_HIGH>; //RESled-gpios = <&porta 14 GPIO_ACTIVE_HIGH>; //BLdebug = <0x1>;};};

makefile

linux_5.10\drivers\staging\fbtft\Makefile

obj-$(CONFIG_FB_TFT_GC9306)     += fb_gc9306.o

config

linux_5.10\drivers\staging\fbtft\Kconfig

config FB_TFT_GC9306tristate "FB driver for the GC9306 LCD Controller"depends on FB_TFThelpGeneric Framebuffer support for GC9306

decofig

build\boards\cv180x\cv1800b_milkv_duo_sd\linux\cvitek_cv1800b_milkv_duo_sd_defconfig

CONFIG_FB_TFT_GC9306=y

驱动

linux_5.10\drivers\staging\fbtft\fb_gc9306.c

// SPDX-License-Identifier: GPL-2.0+
/** FB driver for the GC9306 LCD Controller** Copyright (C) 2015 Dennis Menschel*/#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <video/mipi_display.h>#include "fbtft.h"#define DRVNAME "fb_gc9306"#define GC9306_IPS_GAMMA \"02 00 00 1b 1f 0b\n" \"01 03 00 28 2b 0e\n" \"0b 08 3b 04 03 4c\n" \"0e 07 46 04 05 51\n" \"08 15 15 1f 22 0F\n" \"0b 13 11 1f 21 0F"/*** init_display() - initialize the display controller** @par: FBTFT parameter object** Most of the commands in this init function set their parameters to the* same default values which are already in place after the display has been* powered up. (The main exception to this rule is the pixel format which* would default to 18 instead of 16 bit per pixel.)* Nonetheless, this sequence can be used as a template for concrete* displays which usually need some adjustments.** Return: 0 on success, < 0 if error occurred.*/
static int init_display(struct fbtft_par *par)
{par->fbtftops.reset(par);//硬复位mdelay(50);//display control settingwrite_reg(par, 0xfe);write_reg(par, 0xef);write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, 0x48);//MX, MY, RGB mode 刷新方向 48竖屏write_reg(par, MIPI_DCS_SET_PIXEL_FORMAT, MIPI_DCS_PIXEL_FMT_16BIT);//65k modewrite_reg(par, 0xad,0x33);write_reg(par, 0xaf,0x55);write_reg(par, 0xae,0x2b);//GC9306 Power Sequencewrite_reg(par, 0xa4,0x44,0x44);write_reg(par, 0xa5,0x42,0x42);write_reg(par, 0xaa,0x88,0x88);write_reg(par, 0xae,0x2b);write_reg(par, 0xe8,0x11,0x0b);write_reg(par, 0xe3,0x01,0x10);write_reg(par, 0xff,0x61);write_reg(par, 0xac,0x00);write_reg(par, 0xaf,0x67);write_reg(par, 0xa6,0x2a,0x2a);write_reg(par, 0xa7,0x2b,0x2b);write_reg(par, 0xa8,0x18,0x18);write_reg(par, 0xa9,0x2a,0x2a);//display window 240X320 匹配modewrite_reg(par, 0x2a,0x00,0x00,0x00,0xef);   //MIPI_DCS_SET_COLUMN_ADDRESS - 240write_reg(par, 0x2b,0x00,0x00,0x01,0x3f);   //MIPI_DCS_SET_PAGE_ADDRESS - 320write_reg(par, 0x2c);                       //MIPI_DCS_WRITE_MEMORY_START//GC9306 Gamma Sequencewrite_reg(par, 0xF0,0x02,0x00,0x00,0x1b,0x1f,0x0b);write_reg(par, 0xF1,0x01,0x03,0x00,0x28,0x2b,0x0e);write_reg(par, 0xF2,0x0b,0x08,0x3b,0x04,0x03,0x4c);write_reg(par, 0xF3,0x0e,0x07,0x46,0x04,0x05,0x51);write_reg(par, 0xF4,0x08,0x15,0x15,0x1f,0x22,0x0F);write_reg(par, 0xF5,0x0b,0x13,0x11,0x1f,0x21,0x0F);/* Sleep Out */write_reg(par, 0x11);                       //MIPI_DCS_EXIT_SLEEP_MODEmdelay(100);write_reg(par, 0x2c);                       //MIPI_DCS_WRITE_MEMORY_START// luat_lcd_clear(par, BLACK);/* display on */write_reg(par, 0x29);                       //MIPI_DCS_SET_DISPLAY_ON - 29mdelay(100);return 0;
}/*** set_var() - apply LCD properties like rotation and BGR mode** @par: FBTFT parameter object** Return: 0 on success, < 0 if error occurred.*/
static int set_var(struct fbtft_par *par)
{u8 madctl_par = 0;if (par->bgr)madctl_par =0x48;switch (par->info->var.rotate) {case 0:madctl_par = 0x48;break; //48case 90:madctl_par = 0xE8;break;case 180:madctl_par =0x28;break;case 270:madctl_par =0xF8;break;default:return -EINVAL;}write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, madctl_par);return 0;
}/*** set_gamma() - set gamma curves** @par: FBTFT parameter object* @curves: gamma curves** Before the gamma curves are applied, they are preprocessed with a bitmask* to ensure syntactically correct input for the display controller.* This implies that the curves input parameter might be changed by this* function and that illegal gamma values are auto-corrected and not* reported as errors.** Return: 0 on success, < 0 if error occurred.*/
static int set_gamma(struct fbtft_par *par, u32 *curves)
{//GC9306 Gamma Sequencewrite_reg(par, 0xF0,0x02,0x00,0x00,0x1b,0x1f,0x0b);write_reg(par, 0xF1,0x01,0x03,0x00,0x28,0x2b,0x0e);write_reg(par, 0xF2,0x0b,0x08,0x3b,0x04,0x03,0x4c);write_reg(par, 0xF3,0x0e,0x07,0x46,0x04,0x05,0x51);write_reg(par, 0xF4,0x08,0x15,0x15,0x1f,0x22,0x0F);write_reg(par, 0xF5,0x0b,0x13,0x11,0x1f,0x21,0x0F);return 0;
}/*** blank() - blank the display** @par: FBTFT parameter object* @on: whether to enable or disable blanking the display** Return: 0 on success, < 0 if error occurred.*/
static int blank(struct fbtft_par *par, bool on)
{if (on)write_reg(par, MIPI_DCS_SET_DISPLAY_OFF);elsewrite_reg(par, MIPI_DCS_SET_DISPLAY_ON);return 0;
}static struct fbtft_display display = {.regwidth = 8,.width = 240,.height = 320,.gamma_num = 6,.gamma_len = 6,.gamma = GC9306_IPS_GAMMA,.fbtftops = {.init_display = init_display,.set_var = set_var,.set_gamma = set_gamma,.blank = blank,},
};FBTFT_REGISTER_DRIVER(DRVNAME, "sitronix,gc9306", &display);MODULE_ALIAS("spi:" DRVNAME);
MODULE_ALIAS("platform:" DRVNAME);
MODULE_ALIAS("spi:gc9306");
MODULE_ALIAS("platform:gc9306");MODULE_DESCRIPTION("FB driver for the GC9306 LCD Controller");
MODULE_AUTHOR("Dennis Menschel & Youkai");
MODULE_LICENSE("GPL");

测试

在这里插入图片描述

相关文章:

【milkv】添加LCD屏GC9306

前言 本章介绍如何添加LCD屏GC9306驱动。 电路图 dts build\boards\cv180x\cv1800b_milkv_duo_sd\dts_riscv\cv1800b_milkv_duo_sd.dts &spi2 {status "okay";/delete-node/ spidev0;gc9306: gc93060{compatible "sitronix,gc9306";reg <0&g…...

设计模式--开篇

什么是设计模式 设计模式是软件开发过程中面临的通用问题的解决方案。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性 按使用目的分类 创建型–主要用于创建对象 单例模式-某个类只能有一个实例&#xff0c;提供一个全局的访问点工厂方法模式-创建…...

Android 原生进度条ProgressBar【自带】【水平风格】自定义

由于不想从零开始自定义&#xff0c;Android原生的进度条就已经很够用了呀&#xff01; <ProgressBar​android:id"id/pb_storage"​style"style/Widget.AppCompat.ProgressBar.Horizontal"​android:layout_width"match_parent"​android:l…...

Nginx实现tcp代理并支持TLS加密实验

Nginx源码编译 关于nginx的搭建配置具体参考笔者之前的一篇文章&#xff1a;实时流媒体服务器搭建试验&#xff08;nginxrtmp&#xff09;_如何在线测试流媒体rtmp搭建成功了吗-CSDN博客中的前半部分&#xff1b;唯一变化的是编译参数&#xff08;添加stream模块并添加其对应ss…...

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…...

189. 轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…...

com.alibaba:tools:jar com.alibaba:jconsole:jar

com.alibaba:tools:jar com.alibaba:jconsole:jar...

洛谷 P1020 [NOIP1999 普及组] 导弹拦截【一题掌握三种方法:动态规划+贪心+二分】最长上升子序列LIS解法详解

P1020 [NOIP1999 普及组] 导弹拦截 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码动态规划&#xff08;NOIP要求&#xff1a;时间复杂度O(n^2^)&#xff09;贪心二分&#xff08;O(nlgn)&#xff09; 后话额外测试用例样例输入 #1…...

golang的管道阻塞问题

package mainimport ("fmt""sync"//"time" ) var wg sync.WaitGroup func writeData(intchan chan int){defer wg.Done()for i : 1; i < 9; i {intchan<-ifmt.Println("写入的数据为&#xff1a;",i)//time.Sleep(time.Seco…...

用HTML + javaScript快速完成excel表格信息除重并合并

今天突然接到一个工作&#xff0c;要把两个存储在.xls的主体信息表&#xff0c;除重后合并成一个主体信息表&#xff0c;并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多&#xff0c;如果信息表中的信息量不大的话&#xff0c;手工处理一下也行&#xff0c;如…...

高性能网络编程 - The C10M problem

文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里&#xff0c;因为IPv6协议下每个服务器的潜在连接数都是数以百万级的&#xff0c;单机服务器处理数百万的并发连接&#xff0…...

java计算机毕业设计SpringBoot在线答疑系统

项目介绍 本文从学生的功能要求出发&#xff0c;建立了在线答疑系统&#xff0c;系统中的功能模块主要是实现管理员权限&#xff1b;首页、个人中心、学生管理、教师管理、问题发布管理、疑难解答管理。教师权限&#xff1a;首页、个人中心、疑难解答管理、试卷管理、试题管理…...

Doc as Code (4):使用Git做版本管理,而不是使用目录做版本管理

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 在引入版本管理工具之前&#xff0c;文档工程师使用文件系统提供的功能来管理文件。大家是这样工作的&#xff1a; 文件按照分类放在不同的目录里&#xff0c;使用编辑器&#xff08;如&#xff1a;MS Word&#xff09;打开文档进…...

【Codeforces】 CF1870E Another MEX Problem

题目链接 CF方向 Luogu方向 题目解法 解法1 考虑优化 d p dp dp 转移次数&#xff0c;即只转移有用的区间 不难发现&#xff0c; m e x ( l , r ) m e x ( l 1 , r ) mex(l,r)mex(l1,r) mex(l,r)mex(l1,r) 或 m e x ( l , r ) m e x ( l , r − 1 ) mex(l,r)mex(l,r-1…...

【Objective-C】Objective-C汇总

方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数

怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数 需求分析&#xff1a; 1.统计性别为女性的所获学位下不同学历层次的人数 2.统计不同职务职称的不同学位和学历层次的人数代码 def cal_xuewei_number(self):# 读取表格文件table pd.read_excel("…...

浅谈Elasticsearch查询和搜索

Elasticsearch查询和搜索 Elasticsearch是一个分布式、实时的搜索和分析引擎&#xff0c;广泛应用于全文搜索、日志分析、实时数据分析等场景。Elasticsearch提供了丰富的查询和搜索功能&#xff0c;如查询DSL、过滤、排序、分页、高亮和聚合等。本文将详细介绍如何在Elastics…...

SLAM从入门到精通(被忽视的基础图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业上用激光slam的多&#xff0c;用视觉slam的少&#xff0c;这是大家都知道的常识。毕竟对于工业来说&#xff0c;健壮和稳定是我们必须要考虑的…...

【C++】继承详解

本篇要分享的内容是关于继承的内容哼哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊 以下为本篇目录 目录 1.简单了解继承 2.继承的简单定义 3.继承简单使用 4.继承方式 4.1基类的privat 4.2基类的protected 4.3不可见与private的区别 5.父子类对象赋值转换 6.继承的作用域 7.子…...

react:swr接口缓存

useSWR 是一个 React Hooks&#xff0c;是 HTTP 缓存库 SWR 的核心方法之一。SWR 是一个轻量级的 React Hooks 库&#xff0c;通过自动缓存数据来实现 React 的数据获取。 第一个参数是被缓存的数据的 key&#xff0c; 第二个参数是一个函数&#xff0c;该函数返回数据或者一个…...

如何贡献react-swipeable:开源项目维护和代码提交指南

如何贡献react-swipeable&#xff1a;开源项目维护和代码提交指南 【免费下载链接】react-swipeable React swipe event handler hook 项目地址: https://gitcode.com/gh_mirrors/re/react-swipeable react-swipeable是一个轻量级的React滑动事件处理钩子库&#xff0c;…...

ACE框架:大语言模型上下文优化的智能解决方案

1. ACE框架概述&#xff1a;重新定义大语言模型上下文适应在自然语言处理领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的上下文窗口就像人类的工作记忆——容量有限却至关重要。传统方法往往通过粗暴地扩大窗口尺寸来提升性能&#xff0c;这就像试图用更大的水桶接雨…...

ARM C库线程安全与可重入函数实现解析

1. ARM C库中的线程安全与可重入函数实现在嵌入式系统开发中&#xff0c;多线程编程已成为提升系统性能的必备技能。但随之而来的线程安全问题却让许多开发者头疼不已——数据竞争、死锁、不可预期的行为&#xff0c;这些都可能让精心设计的系统崩溃。ARM C库作为嵌入式开发的基…...

第12章 I2C总线与EEPROM 12.2

12.2.I2C寻址模式上一节介绍的是I2C每一位信号的时序流程&#xff0c;而I2C通信在字节级的传输中&#xff0c;也有固定的时序要求。I2C通信的起始信号(Start)后&#xff0c;首先要发送一个从机的地址&#xff0c;这个地址一共有7位&#xff0c;紧跟着的第8位是数据方向位(R/W)&…...

医疗AI周报:o1模型医学评估与前沿进展解析

1. 医疗AI周报&#xff1a;2024年9月21-27日关键研究解析 上周医疗AI领域涌现出多项突破性研究&#xff0c;其中最引人注目的是o1模型在医学领域的表现评估。这份周报将深入剖析核心论文的技术细节与应用前景&#xff0c;同时梳理其他值得关注的医疗AI研究方向。 作为医疗AI从…...

开发者职业倦怠自救手册:找回编码的快乐——写给软件测试从业者的专业指南

我们为何“倦”了&#xff1f;在软件测试领域深耕多年后&#xff0c;许多从业者会经历这样一个阶段&#xff1a;曾经对发现Bug、保障质量充满热情&#xff0c;如今却感到重复、枯燥甚至迷茫。每天面对相似的测试用例、无穷的回归测试、复杂的自动化脚本维护&#xff0c;以及不断…...

GD32F103RCT6开发板开箱即用指南:从零配置Keil工程到成功烧录第一个程序

GD32F103RCT6开发板极速上手实战&#xff1a;60分钟完成从拆箱到LED闪烁 刚拿到GD32开发板时&#xff0c;那种既兴奋又忐忑的心情我太熟悉了——盒子里的这块小电路板到底能不能顺利跑起来&#xff1f;作为曾经同样从STM32转向GD32的开发者&#xff0c;我总结出这套一小时极速…...

Linux 内核“二号人物”用 AMD 处理器主机运行 AI 工具,助力内核漏洞挖掘

【导语&#xff1a;近日&#xff0c;Linux 内核稳定版维护者 Greg Kroah - Hartman 分享了其 AI 辅助漏洞挖掘工具“gkh_clanker_t1000”的设备照片&#xff0c;是一台搭载 AMD Ryzen AI Max 处理器的 Framework Desktop 迷你主机&#xff0c;该工具已协助发现多个内核漏洞&…...

【云原生Java函数冷启动终极优化指南】:从3200ms到87ms的毫秒级跃迁实录(20年SRE亲测)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;云原生Java函数冷启动毫秒级优化全景认知 云原生Java函数的冷启动延迟是Serverless架构落地的核心瓶颈&#xff0c;其本质源于JVM初始化、类加载、字节码验证、依赖注入框架启动及应用上下文构建等多阶…...

从仿真到芯片:手把手将Simulink定点化FOC代码部署到STM32F4/F1(含数据溢出调试实录)

从仿真到芯片&#xff1a;手把手将Simulink定点化FOC代码部署到STM32F4/F1&#xff08;含数据溢出调试实录&#xff09; 在电机控制领域&#xff0c;Simulink模型仿真与真实硬件部署之间往往存在一道难以逾越的鸿沟。许多工程师能够熟练搭建浮点算法模型并获得理想的仿真结果&a…...