[嵌入式linux] 上网down了个SPI接口AD芯片驱动,感觉有点头大

[复制链接]
 楼主| tiger84 发表于 2010-3-10 08:58 | 显示全部楼层 |阅读模式
//(1)Init_SPI()完成SPI的初始化
void Init_SPI(void)
{
    int i;
    rSPPRE0=0x32;
    rSPCON0=0x1e;
    for(i=0;i<10;i++)
    {
        rSPTDAT0=0xff;
    }
   
    rGPECON |=0x0a800000;
    rGPECON&=(~0x05400000);
    rGPEUP |=0x3800;
    //GPH5----->CS
    rGPHCON |=0x0400;
    rGPHCON&=(~0x0800);
    rGPHUP&=(~0x20);
    rGPHDAT |=0x20;
}
//(2)ad_wr()写入要求A/D转换的通道
static ssize_t ad_wr(struCt file *file,const char *bur,size_t count,loft_t *offset)
{
    int ret;
    int i;
    ret = 0;
    i = 0;   
    dbuf="kmalloc"(count *sizeof(unsigned char),GFP_KERNEL);
    copy_from_user(dbuf,bur,count);
    for(i = 0; i < count; i++)
    {
        ADTXdata[i]=dbuf[i];
    }   
    kfree(dbuf);
    return ret;
}
//(3)ad_rd()得到A/D转换的结果
statie ssize_t ad_rd(struet file *file,char *bur,size_t count,loft t *offset)
{
    int ret;
    int i;
    ret = 0;
    i = 0;
    ad_convert(); // 用2个?
    ad_convert();
    dbuf= kmalloc(count * sizeof(unsigned char),GFP KERNEL);
    for(i = 0; i < count; i++)
    {
        dbuf[i]=ADRXdata[i];
    }     
    copy_to_user(bur,dbuf,count);
    kfree(dbuf);
    return ret;
}
//(4)ad_convert()实际完成A/D转换
void ad_convert(void)
{
    rGPHDAT&=(~0x20);
    udelay(100000);
    spi_tx_data(ADTXdata[0]);
    ADRXdata[0]=rSPRDATO;
    spi_tx_data(0xff);
    ADRXdata [1 ]=rSPRDATO;
    rGPHDAT |=0x20;
}
//(5)spi_tx_data()完成发送数据
void spi_tx_data(unsigned char data)
{
    spi_poll_done();
    rSPTDAT0=data;
    spi_poll_done();
}

//(6)spi_poll_done()轮询SPI状态
static void spi_poll_done(void)
{
    while(!(rSPSTA0&0x01));
}

感觉最后一个函数很有问题,依据我的理解,这种是不是压根就不应该出现在驱动里面?但是各大网站疯狂转载,我又很疑惑,各位兄弟解疑下
PS:用的是s3c2410和AD7888
backupyan 发表于 2010-3-10 20:31 | 显示全部楼层
你怕什么?死循环?
Linux下不是多任务吗?
 楼主| tiger84 发表于 2010-3-10 20:43 | 显示全部楼层
看到这种while(!(rSPSTA0&0x01));写法,我就无语了
goosen 发表于 2010-3-11 20:36 | 显示全部楼层
rSPSTA0 该是某个寄存器(用于标识spi 总线的一个状态,比如发送是否完成或是否空闲等,具体没看spi相关,只是猜)。

//(6)spi_poll_done()轮询SPI状态
static void spi_poll_done(void)
{
    while(!(rSPSTA0&0x01));
}

这么实现,一般情况或许不会有问题(驱动很多都有这么处理法的,简单处理,不过某些情况或许会出现异常,导致跑步下去)。比较好的是,查询一断时间(具体时间需根根据协议或芯片设定),超过则就是超时,返回错误就是。
sinanjj 发表于 2010-3-11 21:54 | 显示全部楼层
一般不会有问题.

但严格意义上讲肯定是有问题的. 比如: spi hack
后学 发表于 2010-3-13 18:44 | 显示全部楼层
你可以定时查询
weng8518 发表于 2010-3-15 21:57 | 显示全部楼层
有点看不懂哦。。。。
 楼主| tiger84 发表于 2010-3-19 13:31 | 显示全部楼层
已经搞定。利用现成的spidev最好了
justin198563 发表于 2012-9-19 22:26 | 显示全部楼层
8# tiger84
justin198563 发表于 2012-9-19 22:27 | 显示全部楼层
楼主能不能给具体说一下啊,谢谢!
zhongguoluren 发表于 2012-10-20 23:49 | 显示全部楼层
看到你们交流,我似乎有点感悟了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:专注ARM及linux性能优化

101

主题

862

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部