在mach-mini2440.c中添加
static struct spi_board_info s3c2410_spi0_board[] ={
[0] = {
.modalias = "spidev",
.bus_num =0,
.chip_select =0,
.irq = IRQ_EINT9,
.max_speed_hz =500*1000,
},
};
static struct s3c2410_spi_info s3c2410_spi0_platdata = {
.pin_cs = S3C2410_GPG2,
.num_cs =1,
.bus_num =0,
};
static struct spi_board_info s3c2410_spi1_board[] ={
[0] = {
.modalias = "spidev",
.bus_num =1,
.chip_select =0,
.irq = IRQ_EINT2,
.max_speed_hz =500*1000,
},
};
static struct s3c2410_spi_info s3c2410_spi1_platdata = {
.pin_cs = S3C2410_GPG3,
.num_cs =1,
.bus_num =1,
};
修改结构体:
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_rtc,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_dm9k,
&net_device_cs8900,
&s3c24xx_uda134x,
//modify by lee
&s3c_device_spi0,
&s3c_device_spi1,
//
};
//modify by lee
s3c_device_spi0.dev.platform_data= &s3c2410_spi0_platdata;
spi_register_board_info(s3c2410_spi0_board, ARRAY_SIZE(s3c2410_spi0_board));
s3c_device_spi1.dev.platform_data= &s3c2410_spi1_platdata;
spi_register_board_info(s3c2410_spi1_board, ARRAY_SIZE(s3c2410_spi1_board));
//
配置内核:
*选SPI_support
* samsung S3C24叉叉 series SPI
* User mode SPI device driver support
使用
打开和设置
fd1 = open(SPIDEV_NAME1, O_RDWR);
if (fd1 < 0)
printf("can't open device");
/*
* spi mode
*/
ret = ioctl(fd1, SPI_IOC_WR_MODE, &l_spi_param[0].mode);
if (ret == -1)
printf("can't set spi mode");
ret = ioctl(fd1, SPI_IOC_RD_MODE, &l_spi_param[0].mode);
if (ret == -1)
printf("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd1, SPI_IOC_WR_BITS_PER_WORD, &l_spi_param[0].bits);
if (ret == -1)
printf("can't set bits per word");
ret = ioctl(fd1, SPI_IOC_RD_BITS_PER_WORD, &l_spi_param[0].bits);
if (ret == -1)
printf("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd1, SPI_IOC_WR_MAX_SPEED_HZ, &l_spi_param[0].speed);
if (ret == -1)
printf("can't set spi1 max speed hz");
ret = ioctl(fd1, SPI_IOC_RD_MAX_SPEED_HZ, &l_spi_param[0].speed);
if (ret == -1)
printf("can't get spi1 max speed hz");
/
获取一个字节数据AA:因为SPI是交换数据,发的同时就是接收,你懂的
struct spi_ioc_transfer tr;
tr.tx_buf = (unsigned long)NULL;
tr.rx_buf = (unsigned long)recv_buf;
tr.len = 1;
tr.delay_usecs = 0;
tr.speed_hz = 0;
tr.bits_per_word = 0;
//printf("speed_hz=%d,bits_per_word=%d\n",tr.speed_hz,tr.bits_per_word);
if(fd>0)
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
else
{
printf("fd is not open\n");
return -1;
}
if (ret == 1)
{
if((*(unsigned char *)recv_buf)==0xAA)
{
//printf("read,recv_buf=%d\n",(*(unsigned char *)recv_buf));
break;
}
}
else
{
//printf("read,recv_buf=%d\n",(*(unsigned char *)recv_buf));
//printf("ret is %d\n",ret);
}
//发数据
struct spi_ioc_transfer tr;
(*(unsigned char *)tempBuf)= cmd;
tr.rx_buf = (unsigned long)NULL;
tr.tx_buf = (unsigned long)tempBuf;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if(ret != 1)
{
printf("set cmd error\n");
}