深入理解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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值