2231|2

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

字符驱动问题,急求助。 [复制链接]

下面是我写的一个8255的驱动程序。用的是EP9315。以下是驱动代码:
#ifdef MODULE
#define __NO_VERSION__
#include
#include
#endif

#define __KERNEL__
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define r8255_Con         0x30C00006
#define r8255_A           0x30C00000
#define r8255_B           0x30C00002
#define r8255_C           0x30C00004
volatile unsigned long Con;
volatile unsigned long PortA;
volatile unsigned long PortB;
volatile unsigned long PortC;
static int D8255_write(struct file *filp,char *buf,int len,loff_t *off);

static unsigned int MAJOR_NUM=254;
static struct file_operations D8255_fops=
{
write:(void(*))D8255_write,

};
char Dname[]="8255DRV";
static int __init D8255_init(void)
{
int ret;
ret = register_chrdev(MAJOR_NUM, Dname, &D8255_fops);
if(ret<0)
{
printk("<1> 8255 register failure!\n");
}

PortA=(volatile unsigned long)ioremap_nocache(r8255_A,1024);

if (check_mem_region(PortA, 1024)<0)
      {
        printk("8255A: Cannot map memory:%08x, memory already in use\n", (int)r8255_A);
        return -1;
      }
else
      {
        printk("8255A: Memory remap:%x => %lx\n",r8255_A,PortA);
      }

request_mem_region(PortA,1024,"8255DRV");

PortB=PortA+2;
printk("8255 B port's virtual addr base=0x%lx\n",PortB);

PortC=PortA+4;
printk("8255 C port's virtual addr base=0x%lx\n",PortC);

Con=PortA+6;
printk("8255 control port's virtual addr base=0x%lx\n",Con);

printk("<1>8255 register success!");

return ret;
}
static void __exit D8255_clearup(void)
{
int ret;
ret = unregister_chrdev(MAJOR_NUM, Dname);
if(ret<0)
{
printk("<1>8255 unregister failure!\n");
}
else
{
iounmap((long *)Con);
iounmap((long *)PortA);
iounmap((long *)PortB);
iounmap((long *)PortC);
release_mem_region(PortA,1024);
printk("8255 unregister success!\n");
}
}

static int D8255_write(struct file *filp,char *buf,int len,loff_t *off)
{
unsigned long iodata;

barrier();
writew(0x8080,Con);//设置控制字,均为方式0输出
udelay(2);
mb();
printk("write Con=%x\n",readw(Con));

if(copy_from_user(&iodata,buf,len))
{return -EFAULT;}

udelay(2);
writew(iodata,PortA);//A口输出数据
udelay(5);
printk("write A!\n");
return len;
}

module_init(D8255_init);
module_exit(D8255_clearup);

驱动程序加载等都成功。
8255的片选信号和写信号都正确,用示波器已经测量过。但是为什么writew(0x8080,Con);测量数据线上的总是不对。我用的是双通道示波器,将片选下降沿作为触发。此时用另一只表笔测量数据线,发现从d7到d0全是在片选的下降沿一会高一会低,这八位变化情况一样。测量执行writew(iodata,PortA)时,测量数据线上的数据在、都是正确的。这是什么原因呢?请各位大侠帮忙分析一下。

最新回复

地址总线和数据总线位宽好好检查一下,一般访问16bit,31bit的数据宽度需要考虑边界对齐  详情 回复 发表于 2009-5-23 22:47
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
大部分出问题的地方,芯片、寄存器地址、地址的读写对齐、片选、时序等等
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
地址总线和数据总线位宽好好检查一下,一般访问16bit,31bit的数据宽度需要考虑边界对齐
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表