文章适用人群
本系列适合有一定内核基础,并向要往内核层发展的人阅读,应用层开发和0基础的人群不适合阅读本篇文章。本篇在Linux统一设备模型中,属于Device的教程。
写前分析
我们在不看源码前简单分析一下,FBTFT设备模块涉及到哪些组成部分。
- TBTFT控制显示屏主要通过SPI协议,应该会涉及到SPI设备的注册
- 显示屏像素之类的信息
设备模块比较简单,只负责添加一些描述数据传给驱动,另外在总线上申请资源。
开始
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