Linux驱动基于SPI子系统的GC9A01驱动程序
前言
为了巩固之前学习的SPI子系统本人写了一个GC9A01的屏幕驱动,现记录一下,以供大家参考
一、添加设备树节点
设备树部分比较简单,大家如果想正确编写出设备树,主要是要参考datasheet来进行配置,
对于GC9A01,它的硬件分布为如下:
引脚名称 | 引脚功能 |
---|---|
GND | 电源负,地 |
VCC | 电源正,3.3 - 5V,需要与通信电平一致 |
SCL | SPI时钟信号输入端口 |
SDA | SPI数据输入端口 |
DC | 数据/命令选择,低电平命令,高电平数据 |
CS | 片选,低电平使能 |
BLK | 背光,悬空使能接地关闭,默认上拉至3.3V |
在知道引脚功能后我们应该在对开发板的引脚进行分析,搞清楚我们外设要接在哪个引脚,用那些引脚进行我们的SPI通讯,下面的lubancat2的外置引脚引出图:
然后我们需要查看datasheet来确定SPI的一些模式:
此处的数据手册来源:技术手册
然后在根据SPI的模式和引脚编写我们的设备树:
&spi3{
status = "okay";
pinctrl-names = "default", "high_speed";
pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>;
pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>;
cs-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>;
spi_gc9a01:spi_gc9a01@0 {
compatible = "ailun,gc9a01";
//片选和时钟最大频率必须添加否则会进不去probe函数
reg = <0>; //选择片选0
//spi-cpha; //添加这一项表示cpha设置为1,不添加则默认为0
//spi-cpol; //添加这一项表示cpol设置为1,不添加则默认为0
//spi-lsb-first; //添加这一项表示从低位开始传输数据,不添加则默认从高位开始传输
//spi-cs-high //添加这一项表示片选高电平选中,默认低电平选中
spi-max-frequency = <45000000>; //最大时钟频率12MHZ ,RK3568最大不能超过50MHZ
dc_control_pin = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>;
res_control_pin = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&spi_oled_dc_pin>;
pinctrl-1 = <&spi_oled_res_pin>;
status = "okay";
};
};
&pinctrl {
spi_oled {
spi_oled_dc_pin: spi_oled_dc_pin {
rockchip,pins = <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_none>;
};
spi_oled_r