/* FBTFT主要数据结构 */
struct fbtft_par {
struct spi_device *spi; /* 设置spi设备 */
struct platform_device *pdev; /* 设置是否是平台设备 */
struct fb_info *info; /* 指向framebuffer fb_info结构的指针 */
struct fbtft_platform_data *pdata; /* 指向平台数据的指针 */
u16 *ssbuf; /* no use */
u32 pseudo_palette[16]; /* 由fb_set_colreg()使用 */
struct {
void *buf; /* 发送缓冲区 */
dma_addr_t dma;
size_t len; /* 发送缓冲区长度 */
} txbuf;
u8 *buf; /* 在SPI上写入初始化数据时使用的小缓冲区 */
u8 startbyte; /* 某些控制器在SPI模式下使用 */
struct fbtft_ops fbtftops; /* 由驱动程序或设备提供的FBTFT操作 */
spinlock_t dirty_lock;
unsigned int dirty_lines_start; /* 开始更新显示的位置 */
unsigned int dirty_lines_end; /* 在哪里结束更新显示 */
struct {
int reset; /* GPIO用于重置显示 */
int dc; /* 数据/命令信号,也称为RS */
int rd; /* 读取锁存信号 */
int wr; /* 写锁存信号 */
int latch; /* 总线锁存信号,例如16-> 8位总线锁存器 */
int cs; /* 采用并行接口总线的LCD芯片选择 */
int db[16]; /* 并行数据总线 */
int led[16]; /* LED控制信号 */
int aux[16]; /* 辅助信号,不由核心使用 */
} gpio;
int *init_sequence; /* 指向LCD初始化数组的指针 */
struct {
struct mutex lock;
unsigned long *curves;
int num_values;
int num_curves;
} gamma;
unsigned long debug; /* 指向调试值的指针 */
bool first_update_done; /* 仅用于第一次显示更新 */
ktime_t update_time;
bool bgr;
void *extra;
};
/* 将显示特定数据传递给驱动程序
*
* @display:显示属性
* @gpios:指向gpio映射的pinname数组的指针
* @rotate:显示旋转角度
* @bgr:LCD控制器BGR位
* @fps:每秒帧数(这将消失,@fbtft_display中使用@fps)
* @txbuflen:发送缓冲区的大小
* @startbyte:设置时,可以在传输中使用Startbyte
* @gamma:Gamma曲线的字符串表示形式
* @extra:一种传递额外信息的方式
*/
struct fbtft_platform_data {
struct fbtft_display display;
const struct fbtft_gpio *gpios;
unsigned int rotate;
bool bgr;
unsigned int fps;
int txbuflen;
u8 startbyte;
char *gamma;
void *extra;
};
/*
* struct fbtft_display - 描述显示属性
* @width:以像素为单位的显示宽度
* @height:显示高度(以像素为单位)
* @regwidth:LCD控制器寄存器宽度(以位为单位)
* @buswidth:以位显示接口总线宽度
* @backlight:背光类型。
* @fbtftops:由驱动程序或设备提供的FBTFT操作(platform_data)
* @bpp:每像素的位数
* @fps:每秒帧数
* @txbuflen:发送缓冲区的大小
* @init_sequence:指向LCD初始化数组的指针
* @gamma:Gamma曲线的字符串表示形式
* @debug:初始调试值
*/
struct fbtft_display {
unsigned int width;
unsigned int height;
unsigned int regwidth;
unsigned int buswidth;
unsigned int backlight;
struct fbtft_ops fbtftops;
unsigned int bpp;
unsigned int fps;
int txbuflen;
int *init_sequence;
char *gamma;
int gamma_num;
int gamma_len;
unsigned long debug;
};
/* struct fbtft_ops - FBTFT操作结构
* @write:写入接口总线
* @read:从接口总线读取
* @write_vmem:写入显示内存
* @write_reg:写入控制器寄存器
* @set_addr_win:设置GRAM更新窗口
* @reset:重置LCD控制器
* @mkdirty:标记显示更新的行
* @update_display:更新显示
* @init_display:初始化显示
* @blank:空白显示(可选)
* @request_gpios_match:将引脚命名为gpio匹配
* @request_gpios:从内核请求gpios
* @free_gpios:免费以前要求的gpios
* @verify_gpios:验证是否存在必需的gpios(可选)
* @register_backlight:用于注册背光设备(可选)
* @unregister_backlight:取消注册背光设备(可选)
* @set_var:使用@rotate和@bgr等变量的值配置LCD
* (可选的)
* @set_gamma:设置伽玛曲线(可选)
*
*大多数这些操作都具有分配给它们的默认功能
* fbtft_framebuffer_alloc()
*/
struct fbtft_ops {
int (*write)(struct fbtft_par *par, void *buf, size_t len);
int (*read)(struct fbtft_par *par, void *buf, size_t len);
int (*write_vmem)(struct fbtft_par *par, size_t offset, size_t len);
void (*write_register)(struct fbtft_par *par, int len, ...);
void (*set_addr_win)(struct fbtft_par *par,
int xs, int ys, int xe, int ye);
void (*reset)(struct fbtft_par *par);
void (*mkdirty)(struct fb_info *info, int from, int to);
void (*update_display)(struct fbtft_par *par,
unsigned int start_line, unsigned int end_line);
int (*init_display)(struct fbtft_par *par);
int (*blank)(struct fbtft_par *par, bool on);
unsigned long (*request_gpios_match)(struct fbtft_par *par,
const struct fbtft_gpio *gpio);
int (*request_gpios)(struct fbtft_par *par);
int (*verify_gpios)(struct fbtft_par *par);
void (*register_backlight)(struct fbtft_par *par);
void (*unregister_backlight)(struct fbtft_par *par);
int (*set_var)(struct fbtft_par *par);
int (*set_gamma)(struct fbtft_par *par, unsigned long *curves);
};