tft lcd spi 驱动
- 参考驱动uc1701
- SPI设备树配置
- 背光控制IO设备树配置
- SPI控制引脚配置
参考驱动uc1701
linux-4.1.15-imx6ul/drivers/staging/fbtft
SPI设备树配置
- 根据原理图修改对应引脚
linux-3.10/arch/arm/boot/dts/sun8iw11p1-pinctrl.dtsi
- 蔽掉引脚冲突功能
linux-3.10/arch/arm/boot/dts/sun8iw11p1-pinctrl.dtsi
sun8iw11p1-pinctrl.dtsi文件中,查找是否有其它功能使用PB13,PC19,PC20,PC21,PC22,如果有则蔽掉。 - spi2节点下增加对应设备属性
- 设备查看
/sys/class/spi_master/spi2/spi2.1/modalias
/sys/bus/spi/devices/spi1.0/modalias
背光控制IO设备树配置
SPI控制引脚配置
** gpio所以计算 **
文件:
sunxi-gpio.h
GPIO定义:
#define SUNXI_PA_BASE 0
#define SUNXI_PB_BASE 32
#define SUNXI_PC_BASE 64
#define SUNXI_PD_BASE 96
#define SUNXI_PE_BASE 128
#define SUNXI_PF_BASE 160
#define SUNXI_PG_BASE 192
#define SUNXI_PH_BASE 224
#define SUNXI_PI_BASE 256
#define SUNXI_PJ_BASE 288
#define SUNXI_PK_BASE 320
#define SUNXI_PL_BASE 352
#define SUNXI_PM_BASE 384
#define SUNXI_PN_BASE 416
#define SUNXI_PO_BASE 448
#define AXP_PIN_BASE 1024
三、计算方式
举两个例子
1、PA13
PA 是从0开始定义的,那么就是: 0 +13 = 13
那么 PA13 的GPIO号 就是 GPIO13
2、PE10
PE 是从128开始定义的,那么就是:128 + 10 = 138
那么 PE10 的GPIO号 就是 GPIO138
链接: 全志GPIO使用
gpio控制器都是由厂商负责驱动好的,在设备树里关于gpio pinctrl的描述,如下:
其中“ #gpio-cells = <6>”表示在设备树里描述使用一个gpio口需要提供6个指定的参数。
通过文档,可以得知6个参数的分别作用如下:
获取设备树里设备节点的gpio口信息:
获取到int类型的gpio口后,就可以使用linux/gpio.h里的gpio口操作函数:
应用例子 :
dtsi:
example{
compatible = "gpio,example";
gpios = <&pio PE 8 1 1 1 1>;
};
代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/sys_config.h>
#include <linux/delay.h>
int example_probe(struct platform_device *pdev)
{
struct device_node *nd = pdev->dev.of_node;
int gpio;
struct gpio_config config;
printk("gpio count:%d\n", of_gpio_named_count(nd, "gpios"));
gpio = of_get_named_gpio_flags(nd, "gpios", 0, (enum of_gpio_flags *)&config);
if (!gpio_is_valid(gpio))
printk("gpio isn't valid\n");
if (gpio_request(gpio, pdev->name) < 0)
printk("gpio request failed %d\n", gpio);
gpio_direction_output(gpio, 1);
msleep(3000);
gpio_direction_output(gpio, 0);
msleep(3000);
gpio_direction_input(gpio);
gpio_free(gpio);
return 0;
}
int example_remove(struct platform_device *pdev)
{
printk("in myremove ...\n");
return 0;
}
struct of_device_id ids[] = {
{.compatible = "gpio,example"},
{},
};
struct platform_driver mydrv = {
.probe = example_probe,
.remove = example_remove,
.driver = {
.owner = THIS_MODULE,
.name = "example" ,
.of_match_table = ids,
},
};
module_platform_driver(example);
MODULE_LICENSE("GPL");