mini2440平台linux2.6.29上的两个SPI的驱动移植

在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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值