2009年2月24日 星期二

「引」使用SPI驱动的接口(SPI API)

spi.c
--------------------------------------
#include
#include

#define TEST_REG 0x01

static char test_read_reg(struct spi_device *spi, char reg)
{
int ret;
char buf[2];
buf[0] = reg; // TX
buf[1] = 0; // RX
//spi_write_then_read(spi, &buf[0], 1, &buf[1], 1);
ret = spi_write(spi, &buf[0], 1);
if (ret != 0)
printk("spi write err\n");
ret = spi_read(spi, &buf[1], 1);
if (ret != 0)
printk("spi read err\n");

return buf[1];
}

static int spi_test_probe(struct spi_device *spi)
{
printk("<1> TEST_REG: 0x%x\n", test_read_reg(spi, TEST_REG));
return 0;
}

static int spi_test_remove(struct spi_device *spi)
{
return 0;
}

static struct spi_driver spi_test_driver = {
.probe = spi_test_probe,
.remove = spi_test_remove,
.driver = {
.name = "innofidei_cmmb",
.owner = THIS_MODULE,
},
};

static int __init spi_test_init(void)
{
return spi_register_driver(&spi_test_driver);
}

static void __exit spi_test_exit(void)
{
spi_unregister_driver(&spi_test_driver);
}

module_init(spi_test_init);
module_exit(spi_test_exit);

MODULE_DESCRIPTION("spi device test");
MODULE_LICENSE("GPL");



Makefile
--------------------------------------
KDIR=/home/ssl/linux-2.6.24-ssl

obj-m += spi.o

all:
make -C $(KDIR) M=`pwd` modules
clean:
make -C $(KDIR) M=`pwd` clean





生成spi_device
linux-2.6.24/arch/arm/mach-magus/a2818p.c
--------------------------------------
static struct spi_board_info _spi[] __initdata =
{
{
.modalias = "WM8987",
.bus_num = 0,
.chip_select = 3,
.max_speed_hz = 100000,
.mode = SPI_MODE_3,
},
{
.modalias = "ads7846",
.bus_num = 0,
.chip_select = 1,
.max_speed_hz = 2500000,
.irq = gpio_to_irq(MAGUS_GPIO_ADS7846),
.platform_data = &ads7846,
},
{
.modalias = "innofidei_cmmb",
.bus_num = 1, // SPI2
.chip_select = 0, // CS0
.max_speed_hz = 4000000, // 4M
.mode = SPI_MODE_0,
},

};

spi_register_board_info(_spi, ARRAY_SIZE(_spi)); //register SPI devices for a given board


spi控制器初始化的时候,会使用spi_board_info生成spi_device
sslspi_probe()
spi_register_master()
scan_boardinfo() // 使用spi_board_info信息生成新的spi_device
spi_new_device()





vi arch/arm/mach-magus/a2818t.c
------------------------------------------
static struct platform_device *devices[] =
{
// &ehci,
// &usbd,
// &otg,
&sdhc,
// &sdhc2,
&spi,
&spi2,
&i2c,
&rtc,
&wdog,
&kpp,
&lcdc,
&lcdcw1,
&lcdcw2,
&tvout,
&vpp,
&vip,
&d2d,
&nfc,
};


vi arch/arm/mach-magus/magus.h
------------------------------------------
//#if defined CONFIG_ACCIO_PF101 || defined CONFIG_ACCIO_P1
RCN_AIDP(spi2, "spi", 1, MAGUS_IO_SPI2, MAGUS_IRQ_SPI2, MAGUS_DMA_SPI2_TX, FREE_PIN, FREE_PIN, FREE_PIN, FREE_PIN, FREE_PIN );
//#endif

(http://hi.baidu.com/zengzhaonong/blog/item/0d9356543b084952564e00d6.html)

沒有留言:

張貼留言