深入理解FBTFT--编写自己的FB驱动1(Device)

深入理解FBTFT--编写自己的FB驱动

文章适用人群

本系列适合有一定内核基础,并向要往内核层发展的人阅读,应用层开发和0基础的人群不适合阅读本篇文章。本篇在Linux统一设备模型中,属于Device的教程。

写前分析

我们在不看源码前简单分析一下,FBTFT设备模块涉及到哪些组成部分。

  1. TBTFT控制显示屏主要通过SPI协议,应该会涉及到SPI设备的注册
  2. 显示屏像素之类的信息

设备模块比较简单,只负责添加一些描述数据传给驱动,另外在总线上申请资源。

开始

fbtft_device.c的逻辑。
在这里插入图片描述
我们改一下fbtft的源码,在device里只负责向总线申请硬件资源,而不在deivce里填写自己的platform_data,因为支持的显示屏有很多种,这些显示屏的信息完全可以放在各自的driver中进行设置。

自己的fboled_device.c
弃坑了,想清楚了一个道理,现在的能力写不了框架,等之后再来填坑。

#define pr_fmt(fmt) "fboled_device: " fmt
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/gpio/consumer.h>
#include <linux/spi/spi.h>
#include <video/mipi_display.h>

#include "fboled.h"



//deivice负责设置SPI的四根引脚,其他的GPIO(电源,DC)在Driver里设置


static struct spi_device *spi_device;
static struct spi_board_info *spi;

static void fboled_device_spi_delete(struct spi_master *master, unsigned int cs)
{
	struct device *dev;
	char str[32];
	snprintf(str, sizeof(str), "%s.%u", dev_name(&master->dev), cs);
	dev = bus_find_device_by_name(&spi_bus_type, NULL, str);
	if (dev) {
			dev_info(dev, "Deleting %s\n", str);
			device_del(dev);
	}
}

static int fboled_device_spi_device_register(struct spi_board_info *spi)
{
	struct spi_master *master;

	master = spi_busnum_to_master(spi->bus_num);
	if (!master) {
		pr_err("spi_busnum_to_master(%d) returned NULL\n",
		       spi->bus_num);
		return -EINVAL;
	}
	/* make sure it's available */
	fboled_device_spi_delete(master, spi->chip_select);
	spi_device = spi_new_device(master, spi);
	put_device(&master->dev);
	if (!spi_device) {
		dev_err(&master->dev, "spi_new_device() returned NULL\n");
		return -EPERM;
	}
	return 0;
}


static int fboled_Register_SpiDevice(void)
{
	spi->modalias="Test";
	spi->max_speed_hz="100000000";//100M
	spi->mode=SPI_MODE_0;
	spi->platform_data=NULL;
	spi->chip_select=1;
	spi->bus_num = 0;
	return fboled_device_spi_device_register(spi);

}


static int __init fboled_device_init(void)
{
	spi=kzalloc(sizeof(*spi),GFP_KERNEL);
	fboled_Register_SpiDevice();
	int ret = 0;
}

static void __exit fboled_device_exit(void)
{

		device_del(&spi_device->dev);
		kfree(spi_device);

}



arch_initcall(fboled_device_init);
module_exit(fboled_device_exit);

MODULE_DESCRIPTION("Add a FB device.Display image or vidieo on the screen");
MODULE_AUTHOR("Boss poipoi");
MODULE_LICENSE("GPL");

填写需要的SPI控制器信息,检测申请的SPI是否被占用,向SPI总线申请这些资源,完成设置等待驱动进行匹配。

结尾

如果你看到了这句话,说明我还没编译测试(x

<think>好的,用户需要找到ST7735显示屏在Linux系统下的驱动方法或资源。首先,我应该回忆一下常见的嵌入式显示屏驱动方法。ST7735通常用于小型LCD屏幕,常见于树莓派或Arduino项目。不过用户提到的是Linux系统,可能是在嵌入式Linux平台,比如树莓派、BeagleBone或者类似的开发板。 接下来,我需要考虑Linux驱动这类屏幕的一般方法。通常有两种途径:一是使用已有的内核驱动模块,二是使用用户空间的库,比如通过SPI或GPIO直接控制。ST7735通常通过SPI接口通信,所以可能需要配置SPI驱动。 然后,我应该检查是否有现成的内核模块支持ST7735。Linux内核中有一些FBDEV(帧缓冲设备)驱动,可能包含相关支持。需要查看内核配置选项,比如CONFIG_FB_ST7735或者类似的。如果内核中没有,可能需要使用第三方模块或者用户空间的解决方案。 另外,用户空间库方面,像Adafruit的Python库(如Adafruit_CircuitPython_ST7735)可能适用,但通常用于微控制器,比如CircuitPython。不过,在Linux下可能需要使用类似的库,或者通过Python的SPI库直接编写驱动。 接着,我需要查找是否有开源项目或教程。GitHub上可能有相关项目,比如使用C或Python编写的ST7735驱动,适用于树莓派或其他Linux开发板。例如,使用wiringPi或bcm2835库进行SPI通信的示例代码。 还有,参考用户提供的引用内容,其中提到了Intel OpenVINO工具包和端口检查命令。虽然这些可能与ST7735无关,但用户可能在使用某种开发环境,需要确保SPI接口已正确配置,比如检查/dev/spidev*设备是否存在,以及相关内核模块是否加载(如spi_bcm2835)。 另外,用户可能需要配置帧缓冲设备,或者使用像fbtft这样的项目,该项目为小型TFT显示屏提供驱动支持。例如,fbtft支持多种SPI显示屏,可能包括ST7735。需要指导用户如何编译和加载fbtft模块,并配置设备树覆盖(Device Tree Overlay)。 最后,应该提醒用户检查硬件连接,确保SPI引脚正确连接,并且Linux系统中的SPI已启用。可能需要使用工具如spidev_test来测试SPI通信是否正常。 总结可能的步骤:1. 检查内核驱动fbtft支持;2. 使用用户空间库如Python或C进行SPI控制;3. 参考GitHub上的开源项目;4. 配置SPI接口和引脚;5. 测试通信。</think>关于ST7735显示屏在Linux系统的驱动方法与资源,以下是分步骤说明: 1. **内核驱动fbtft支持** - ST7735属于SPI接口的小型TFT显示屏,可尝试使用Linux内核的`fbtft`驱动模块 - 加载驱动命令示例: ```bash sudo modprobe fbtft_device name=adafruit-st7735s cs=1 dc=9 reset=12 speed=40000000 ``` 参数需根据实际GPIO引脚调整[^3] 2. **用户空间编程方案** - 使用Python库控制SPI接口: ```python import spidev spi = spidev.SpiDev() spi.open(0,0) # 对应SPI总线编号 spi.xfer([0x01, 0x02]) # 发送显示屏初始化指令 ``` - C语言通过ioctl控制SPI设备: ```c int fd = open("/dev/spidev0.0", O_RDWR); ioctl(fd, SPI_IOC_WR_MODE, &mode); // 设置SPI模式 ``` 3. **硬件准备要点** - 确认SPI接口已启用: ```bash ls /dev/spidev* # 检查设备节点 dtoverlay=spi0-1cs # 树莓派配置/boot/config.txt ``` - 接线验证建议使用逻辑分析仪抓取SPI波形 4. **开源参考项目** - **fbtft源码**:https://github.com/notro/fbtft - **Python驱动示例**:https://github.com/adafruit/Adafruit_CircuitPython_ST7735 - **C语言实现参考**:https://github.com/raspberrypi/linux/tree/rpi-5.15.y/drivers/staging/fbtft
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值