- 博客(21)
- 资源 (1)
- 收藏
- 关注
原创 RK3288 Uboot Display 驱动详解
怀揣着十几个疑问整理了rk3288 uboot 阶段display相关代码:1、代码流程由rk3288 uboot 启动流程分析可知,dispaly 驱动在board_fbt_preboot;中被调用,如下所示:#ifdef CONFIG_LCD /* logo state defautl init = 0 */ g_logo_on_state = 0; if (gd->fdt_blob) { int node = fdt_path_offset(gd->fdt_blob, "/
2021-02-26 20:24:51
2842
1
原创 RK3288 Uboot启动流程分析
Uboot的启动过程大同小异,rk3288的uboot启动也是分为两个过程:uboot的启动由arch/arm/cpu/armv7/start.S 开始,调用了_main,而_main 的实现是在arch/arm/lib/crt0.S中完成,在_main中主要完成以下几个任务:1、为调用board_init_f 设置初始环境,这个环境起始就是提供了一个堆栈和一个存储GD结构体的地方。2、调用board_init_f。在这里会初始化串口、timer、计算重定位的位置等。3、调用relocate_cod
2021-02-23 18:33:19
2328
原创 Linux内核completion机制
我们可以在内核中创建很多线程了,但是这些线程之间怎么互动呢?完成量机制,是linux系统提供的一种同步机制,用于一个执行单元等待另一个执行单元执行完某件事。(一个线程阻塞在那,等待另外一个线程去唤醒它)struct completion{ unsigned int done; wait_queue_head_t wait;};1、定义completionstruct completion my_completion;2、初始化completioninit_completio
2021-02-07 20:49:59
662
原创 Linux 内核线程kthread
我们可以使用kthread_run()去创建一个内核线程并启动它,当一个内核线程被启动之后就会不停的运行下去除非其他线程调用了kthread_stop来结束这个线程,但是我们在调用kthread_stop之前一定要检查需要被终止的线程是否还在运行,如果kthread_stop调用了一个未运行的线程造成的后果是完犊子的(我这里做的实验就是导致我的虚拟机完全卡死,原因是kthread_stop调用的参数是个NULL),为了避免这种现象的出现还有一个重要的函数:kthread_should_stop,他的返回值是
2021-02-07 20:45:02
2569
原创 BT.1120建议书分析
隔行系统和逐行系统隔行系统中:一副画面可以分成奇数行和偶数行,在隔行系统中会先把所有的”奇数行“或者"偶数行"从左到右从上而下扫描一遍,在去从左到右从上而下扫描这副画面所有的"偶数行”或者“奇数行”。这样其实两帧才能合成一个完整的一帧数据。对于每秒30帧的隔行系统来说,其实真是传输的只有每秒15帧的图像数据。逐行系统:依次扫描一整副画面。BT.1120支持隔行和逐行两种形式。隔行扫描可以有效降低信道带宽,但是其显示效果不好,逐行扫描已经成为主流了。一行数据的组成4个字节的EAV+辅助数据包+4个字
2021-01-13 16:49:13
757
原创 YUV
YUVYUVYUV是视频、图片、相机等应用中使用的一类图像格式,与RGB格式不同,YUV是一个称为Y(相当于灰度)的”亮度“分量和两个”色度“分量表示,分别称为U和V优点使用YUV格式显示图片有两个优点:1、因为YUV中Y代表的是图片或者视频的亮度信息,所有我们使用YUV转换成黑白图片时非常方便,只需要提取其Y分量的数值就行了,这一特性用于电视信号上非常友好的支持了黑白电视。2、人眼对亮度的敏感程度超过了对色度的敏感程度,利用这个原理YUV可以将代表色度的UV信息减少一点,也不影响其色彩表现,这使得
2020-12-23 16:16:24
396
原创 BMP文件解析及显示
我们在LCD上显示内容的时候,经常会有显示bmp文件的需求,例如显示一个logo、菜单图标等。我们可以在应用程序中打开bmp文件,然后将它解析成rgb格式的数据写入frame buffer中就可以完成显示。1 BMP文件的格式BMP图像文件格式是Windows采用的图像文件存储格式,在Windows环境下的所有图像处理软件都支持这种格式。它是由3个部分组成:位图文件头、位图信息头、颜色点阵数据。1.1 位图文件头位图文件头分为4个部分,共占据14字节:1.2 位图信息头位图信息头
2020-11-25 19:53:53
3296
4
原创 Linux在应用层读写寄存器
先说结论:在应用层可以通过操作/dev/mem设备文件,以及mmap函数,将寄存器的地址映射到用户空间,然后直接在应用层对寄存器进行操作。1、dev/mem 设备文件该设备文件是物理内存的全映像,通过分析dev/mem设备驱动可以知道,通过这个设备文件可以映射整个处理器的地址空间,而不单单是内存。这里的地址空间指的是处理器总线上的全部可寻址空间。除了内存,还有外设IO空间。也就是说通过/dev/mem可以映射0-0xFFFFFFFF的全部物理地址(这个物理地址是真是有效的,处理器访问这个物理地址
2020-09-24 14:04:15
1334
2
原创 Linux-Audio Codec
0、简要介绍处理器要处理外界的声音需要将外界的声音(模拟信号)转换成二进制数据(数字信号),这个过程涉及到了一个模拟信号到数字信号的转换过程,完成这个功能的就是ADC芯片,同样,如果处理器需要对外输出声音,那就就需要将数字信号装换成模拟信号,完成这个功能的就是DAC芯片。将这两者合起来我们就称之为音频编解码芯片,也就是Audio Codec。其工作流程是:外界的声音(模拟信号)通过麦克风进入Audio Codec中,经由ADC模块将模拟信号转换成数字信号后通过IIS接口送给SOC,SOC对这些数
2020-09-08 17:55:18
2203
2
原创 Linux子系统-IIC子系统
0、IIC总线汇总概览(1)三根通线线:GND、SCL、SDA(2)同步(同步通信,通信双方有一根时钟线,主从在同一个时钟下工作)、电平(通信线上传输的是电平信号)、低速、近距离(3)总线式结构,支持多个设备挂接在同一条总线上(4)主从式结构,通信双方必须一个是主设备、一个是从设备。主设备掌握每次通信的主动权,从设备按照主设备的节奏被动响应,每个从设备在总线中有唯一的地址,主设备通过从地址找到自己要通信的从设备(本质是广播)。(5)IIC主要用途就是主SOC和外围设备之间的通信,最大的优
2020-08-26 11:18:11
832
原创 linux中断处理上下部分
Linux中断处理为什么需要分为上下部分?linux中断处理不参与调度,所以中断处理事件过长会影响实时性;中断处理函数(ISR)运行事件应尽可能短,但有些处理不可能再很短时间内处理完成,于是linux内核提供中断处理上下部。Linux 中断处理上下部含义中断处理的上半部(top half ,又叫顶半部);中断处理的下半部(bottom half , 又叫底半部);上半部指的是中断处理程序,下半部则是指一些虽然与中断有相关性但是可以延后执行的任务。例如:在网络传输中,网卡接收到数据包这个.
2020-08-20 19:06:22
1174
原创 input_event 详解-Touch Screen
关键结构体解析:struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value;};type: 上报事件的类型EV_SYN: 同步事件EV_KEY:键盘事件EV_REL: 相对坐标事件-鼠标EV_ABS: 绝对坐标事件-触摸屏我们解析一个input event 时,首先要确定type属性,code和value属性都是根据不同的ty...
2020-08-13 16:32:42
6096
2
原创 Input子系统-Touch Screen
0、Input 子系统介绍Linux内核为了更好的统一的管理输入型设备:键盘、鼠标、触摸屏、摇杆等,建立起来的一套内核框架,分为四个部分:应用层、input event 、input core、硬件驱动。代码结构:input event: /kernel/drivers/input/evdev.c (通用模型) /kernel/drivers/input/mousedev.c /kernel/driv...
2020-08-11 20:16:20
890
2
原创 IIC Tools
0 简介IIC-Tools 是linux下的一个开源工具,使用它可以在命令行中队IIC设备进行访问。我们可以在https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 下载这个工具。1 安装下载解压完成后,修改Make file,使用交叉编译工具链对其进行编译,编译后再Tools文件夹下可以得到i2cdetect,i2cdump,i2cset,i2cget ,i2ctransfer这几个可执行文件:i2cdet..
2020-08-06 17:12:14
477
原创 RK1808 DRM 驱动流程分析
rockchip drm驱动的启动流程图:第一阶段:mipi_dsi_proberes = platform_get_resource(pdev, IORESOURCE_MEM, 0); //获取内存资源dsi->irq = platform_get_irq(pdev, 0); //获取中断资源dsi->pclk = devm_clk_get(dev, "pclk"); //获取pclkdsi->regmap = devm_regmap_init_mmio.
2020-07-29 20:44:10
1988
原创 RK1808 MIPI屏幕上电初始化
&dsi {status = "okay";panel@0 {compatible = "sitronix,st7703", "simple-panel-dsi";panel-init-sequence = [05 fa 01 1139 00 04 b9 f1 12 8339 00 1c ba 33 81 05 f9 0e 0e 00 00 0000 00 00 00 00 44 25 00 91 0a00 00 02 4f 01 00 00 3715 .
2020-07-24 17:39:57
1846
原创 MIPI DSI 驱动需要做哪些事情?
1、mipi dsi host init1、set escape clock frequency = 20Mhz (2、dsi_dpi_config 、 display mode config3、DSI_PCKHDL_CFG4、dsi video mode config(DSI_VID_MODE_CFG)5、dsi video packet config (DSI_VID_PKT_SIZE)6、dsi command mode config (DSI_TO_CNT_CFG、DSI_B
2020-07-21 15:00:25
1152
原创 rk1808 调试-mipi_dsi_probe
0、背景在调试LCD驱动时,查看内核打印信息发现 “failed to get mipi dphy”定位到是 dw_mipi_dsi_probe 函数中出了问题;进一步添加打印信息可以定位到问题出现在在函数devm_phy_optional_get中:该函数返回了个错误值,在IS_ERR中报错;1、devm_phy_optional_get该函数的功能是查找并返回一个phy;dev: 请求该phy的设备;string: phy的名称该函数调用...
2020-07-16 21:55:28
1951
1
原创 rockchip_drm_drv.c 分析
static int rockchip_drm_platform_probe(struct platform_device *pdev)port = of_parse_phandle(np, "ports", i); //遍历subsys 下的ports属性component_match_add(dev, &match, compare_of, port->parent); //将每个ports属性加入数组中rockchip_add_endpoints(dev, &matc
2020-07-02 20:29:34
1074
原创 component 框架
背景:kernel中的component框架是为了subsystem能够按照一定的顺序初始化设备而提出的架构。subsystem中由较多设备模块组成(display subsystem 即由CRCT、encoder、connecter、gsm、等模块组成),而内核加载每个模块时间不定。则需要component框架来保证需最后初始化的设备加载前,所需设备全部加载完毕。架构描述:在component中,包含两个基本概念,master和component。master是设备树中的“超级设备(super
2020-06-30 15:08:11
1613
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人