最近在做RC522在linux系统上的驱动,板卡采用天嵌科技的TQ210板卡,这个板卡用的S5PV210处理器。调试过程会分篇来写。
RC522在单片机上很好移植,但是一旦基于linux系统上就没这么容易了。本人也是费劲周折。
首先了解关于linux中SPI驱动的基本知识,网上有很多参考,请自行寻找。
1 .平台设备的注册条件
注册设备驱动引入了设备驱动管理机制,也就是platform device和platform drivers。在设备驱动注册之前,它的关联设备platform device必先完成注册。
2 . arch/arm/mach-s5pv210/mach-tq210.c中的platform device
平台初始化过程中,会运行tq210_machine_init函数,此函数中会运行platform_add_devices(tq210_devices, ARRAY_SIZE(tq210_devices));添加设备,下面看tq210_devices这个结构体中有定义关于spi总线的两句话
&s5pv210_device_spi0,
&s5pv210_device_spi1,
在dev-spi.c文件中有关于上面两句话的定义
struct platform_device s5pv210_device_spi0 = {
.name = "s3c64xx-spi",
.id = 0,
.num_resources = ARRAY_SIZE(s5pv210_spi0_resource),
.resource = s5pv210_spi0_resource,
.dev = {
.dma_mask = &spi_dmamask,
.coherent_dma_mask= DMA_BIT_MASK(32),
.platform_data = &s5pv210_spi0_pdata,
},
};
此结构体中定义了platform_device。
现在回到arch/arm/mach-s5pv210/mach-tq210.c中来,tq210_machine_init函数中还运行了
if (!gpio_request(S5PV210_GPB(1), "SPI_CS0")) {
gpio_direction_output(S5PV210_GPB(1), 1);
s3c_gpio_cfgpin(S5PV210_GPB(1), S3C_GPIO_SFN(1));
s3c_gpio_setpull(S5PV210_GPB(1), S3C_GPIO_PULL_UP);
s5pv210_spi_set_info(0,S5PV210_SPI_SRCCLK_PCLK, ARRAY_SIZE(smdk_spi0_csi));
}
if (!gpio_request(S5PV210_GPB(5), "SPI_CS1")) {
gpio_direction_output(S5PV210_GPB(5), 1);
s3c_gpio_cfgpin(S5PV210_GPB(5), S3C_GPIO_SFN(1));
s3c_gpio_setpull(S5PV210_GPB(5), S3C_GPIO_PULL_UP);
s5pv210_spi_set_info(1,S5PV210_SPI_SRCCLK_PCLK, ARRAY_SIZE(smdk_spi1_csi));
}
spi_register_board_info(s3c_spi_devs, ARRAY_SIZE(s3c_spi_devs));
注册spi总线,
s3c_spi_devs[]结构体中定义了模式,最高速度,总线等描述,此处再调试过程中发现.max_speed_hz的数值不可低于130000,若低于此数值,编译内核之后来/dev中无法查看到spidev0.0及spidev1.0设备。