当前位置:  技术问答>linux和unix

[求助]驱动中寄存器操作问题

    来源: 互联网  发布时间:2016-09-27

    本文导语:  刚刚接触Linux驱动,最近在做一个串口扩展芯片的驱动,现在已经可以在内核挂载驱动模块了,测试代码也可以正常进入ioctlwrite函数操作。但是无法对扩展芯片的寄存器进行操作,cpu是ARM的2440,串口扩展芯片连接8位...

刚刚接触Linux驱动,最近在做一个串口扩展芯片的驱动,现在已经可以在内核挂载驱动模块了,测试代码也可以正常进入ioctlwrite函数操作。但是无法对扩展芯片的寄存器进行操作,cpu是ARM的2440,串口扩展芯片连接8位数据总线,地址空间为BANK5。大家帮忙分析下问题,现在自己没什么思路。

//TL16C554 address map
//扩展芯片寄存器物理地址到虚拟地址映射,这个函数在模块加载_init中调用
int tl1A_AddressMap(void)
{
        tl1A.vBase = (unsigned char *)ioremap_nocache(tl1A.nAddress, 8);
        if(tl1A.vBase == NULL)
                return -1;

        tl1A.RBR = (int)(tl1A.vBase);
        tl1A.THR = (int)(tl1A.vBase);
        tl1A.LSR = (int)(tl1A.vBase + 5);
        tl1A.MSR = (int)(tl1A.vBase + 6);
        tl1A.LCR = (int)(tl1A.vBase + 3);
        tl1A.FCR = (int)(tl1A.vBase + 2);
        tl1A.MCR = (int)(tl1A.vBase + 4);
        tl1A.DLL = (int)(tl1A.vBase);
        tl1A.DLM = (int)(tl1A.vBase + 1);
        tl1A.IER = (int)(tl1A.vBase + 1);
        tl1A.SPR = (int)(tl1A.vBase + 7);
        tl1A.IIR = (int)(tl1A.vBase + 2);

        return 0;
}
//外设芯片的初始化
//TL1A初始化
void Init_TL1A(void)
{
volatile unsigned char byRx = 0;
int i = 0;

//初始化接收缓冲区指针
tl1A.sRecvHead = 0;
tl1A.sRecvTail = 0;

 //FIFO控制寄存器
        //设置FCR.FIFO使能,RXD复位,TXD复位,mode=1,触发为14;轮询方式触发设置无效
        writeb(0xcf, tl1A.FCR);

        //*(volatile unsigned char *)(tl1A.FCR) = 0xcf;
        for(i=0; i 4096)    //每个通道最多只能缓存16个字节
                        break;
}
}

//应用程序调用ioctl进行内存初始化,打印寄存器信息
static int TL1A_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
switch(cmd) 
{
case TL_INIT:
printk("IER = 0x%x n",readb(tl1A.IER));
printk("LCR = 0x%x n",readb(tl1A.LCR));
printk("DLL = 0x%x n",readb(tl1A.DLL));
printk("DLM = 0x%x n",readb(tl1A.DLM));
Init_TL1A();
printk("IER = 0x%x n",readb(tl1A.IER));
                        printk("LCR = 0x%x n",readb(tl1A.LCR));
                        printk("DLL = 0x%x n",readb(tl1A.DLL));
                        printk("DLM = 0x%x n",readb(tl1A.DLM));

break;
default:
return -EINVAL;
}

现在的问题就是初始化前后的寄存器和设定值不同,有个疑问:
1.自己做的板子,在内核中没有进行虚拟地址和物理地址的映射设定,程序采用动态映射,是否有影响?
2.刚接触Linux驱动,有个疑问,我现在要操作的是外部设备寄存器,采用动态地址映射是否可以?驱动读写ARM控制寄存器是正常的
初始化代码、读写代码在无OS情况下都验证过了,读写都没有问题。
自己已经调试两天了,有点焦头烂额,只好来论坛求助了~~~,大家帮帮忙

|
1.自己做的板子,在内核中没有进行虚拟地址和物理地址的映射设定,程序采用动态映射,是否有影响?
// 我的理解,调用ioremap_nocache,就已经进行了内核虚拟地址和物理地址的映射了。在内核态直接使用内核虚拟地址就可以操作硬件了。

|

映射的时候要将范围指定好,8个寄存器肯定不是第二个参数为8的,这肯定有问题啊

|
呵呵,在驱动力地址映射好了就可以直接操作寄存器的哦

|
遇见:
映射程序有点不规范,至少应该在映射之间先向系统请求该物理空间tl1A.nAddress,查看是否可用。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • [求助]linux下的usb驱动开发的书籍
  • 高分求助foxpro的jdbc驱动程序!!!!
  • 求助:Linux下USB驱动的问题
  • 求助 !!ALSA声卡驱动错误!
  • 求助:makefile,驱动与linux内核的关系?
  • 求助:一个简单的驱动
  • 【求助】:如何用ioctl()函数调用一个驱动程序
  • 求助!驱动如何触发程序?
  • 关于JDBC for Oracle驱动的问题?紧急求助?
  • 求助,关于显卡驱动的安装,高手请进,谢谢
  • 求助````我该用哪个驱动啊?
  • 求助!声卡驱动怎么上!!!
  • 求助 简单测试字符驱动 Cannot allocate memory
  • 求助:如何移植DM9000网卡驱动到linux2.6内核?
  • 罗技快看畅想版UVC 摄像头驱动求助??????
  • 求助,关于编译驱动进内核的一个问题,实在找不到资料了!
  • [求助]请问Linux下怎么打开exe文件啊,小弟想安装网卡驱动啊
  • 求助 82576驱动
  • 求助啊,Linux 系统怎么看装了哪些驱动
  • [求助]关于驱动静态编译进内核的问题!
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • NOSQL iis7站长之家
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3