ARM课程总结

经过前期两个月的突击学习以及最近三个周的应用,对ARM体系结构有了更加清楚的认识,在应用中能够看懂相应的驱动程序并根据自己的目地做相应的修改,下面罗列对一些已经熟悉的知识点的认识。

一、存储器

在移植uboot引导程序的时候更清楚的了解了ARM的存储体系。S3C2410A内部集成了Nand flash的控制器,如果使用Norflash作为引导程序的存储位置,S3C2410A4KBBootSRAM地址空间就映射到了0x40000000,如果使用Nand flash作为引导程序的存储位置,则映射到了0x0开始的4KB地址空间。所以在uboot中支持双启动的时候有一种判断方法是:写入数据到0x40000000之后4KB之内空间,然后从0x0开始的对应空间内读取数据,如果和写入的相同则说明是使用Nand作为引导存储器,否则为Nor

       系统启动的时候自身会根据OM[0:1]的引脚信号来判断使用什么样的存储器作为引导程序的存储,如果使用Norflash,则直接在Norflash中运行引导程序,如果使用Nandflash则会通过Nand控制器自动加载Nandflash4KBBootSRAM中,然后把0x0赋给PC,所以我们的uboot引导程序必须烧写到Nandflash0x0开头的空间内。由于BootSRAM只有4KB的空间,而我们的uboot至少要90KB的空间,所以在uboot的前4KB,我们必须完成ubootNandflashSDRAM的拷贝,并且校验拷贝成功后跳转到SDRAM中运行。拷贝程序当然就是对Nandflash的读操作,然后写入到SDRAM,验证程序是通过比较0x0开始的4KBSDRAM中已经拷贝的uboot的前4KB是否相等来判断是否拷贝成功。Nand控制器是通过FCE片选信号选中Nandflash,然后通过把地址转换分三次发送到NandflashI/O引脚,最后从I/O引脚读取数据,再写入到SDRAM中。

       S3C2410A的存储结构是通过8nGCS选择bank,每个band上根据需要接上相应的存储器,比方说:博创试验箱就是使用bank6作为SDRAMnGCS6引脚接到SDRAM片选上。

       S3C2410A采用的是32位地址总线,而有的存储器采用的是8位或16位,所以在接线的时候必须把A2与存储器的A0连接,并把存储器排成32位的存储器,然后就可以一次读取32位的数据,对总线的操作不至于浪费。

二、中断控制器

S3C2410A共有8个异常中断,我们经常使用的是IRQ中断请求,在产生中断请求的时候,系统会跳转到中断入口地址中运行,比如:IRQ中断的入口地址是0x00000018。所以入口地址必须存储跳转指令,跳转到对应的中断处理程序中,在中断处理程序中读取中断偏移寄存器,判断是哪一个中断源产生的中断,然后加上中断向量表的基址计算出中断处理程序的位置,然后跳转到对应的处理程序中,如果是外部中断请求,还要再进一步通过读取外部中断寄存器判断具体的中断源,然后进行处理。

我们可以通过设置中断屏蔽寄存器来设置要屏蔽的中断,这样就不会产生不必要的中断处理。在移植网卡驱动的时候,我没有注意中断的触发方式,在注册中断处理程序的时候要通过设置外部中断控制寄存器来设置中断源的触发方式,才能产生中断并做相应的处理。

Linux内核对于中断的处理同样是在开始的地址空间存放中断向量表,但是ARMV4以后的处理器也同样支持中断向量表存放在0xffff0000,这个需要通过配置CP15协处理器来实现,然后通过一个算法计算出每一个中断的中断号,在有中断请求的时候再通过这个算法计算具体的中断源,最后跳转到arm_do_irq函数中处理,arm_do_irq通过判断传入的中断号参数跳转到驱动程序初始化注册的中断处理程序中进行处理。这里说明一下arm汇编的传参方式:r0寄存器可以作为第一个参数,r1-r2同样可用,如果超过三个参数推荐使用堆栈的方式传递参数。

三、LCD控制器

LCD液晶显示器主要分为TFTSTN两种,由于最近使用的LCDTFT的,所以对STN的还不是太了解。

存储器数据格式有24BPP16BPP8BPP,我使用的那个是16BPPS3C2410A提供256色调色板,调色板支持565格式和5551格式,我使用的那个设置成了565格式,在计算像素数据的时候通过位移的方法获取像素的值,我们可以通过配置控制寄存器1来设置每像素模式,通过控制寄存器5来设置输出视频存储器数据格式,LCD中断登记寄存器中存储了两个中断源,一个是帧同步中断源,一个是FIFO中断源,我们可以在中断处理程序中读取这个寄存器判断是具体哪个中断,然后执行相应的操作。

对于帧缓冲区地址的计算还不是太明白,这两天在移植LCD驱动的时候发现了一个问题,内核原有的驱动程序我们传递了根据自己的LCD设定的参数以后可以正常的显示,但是在逐行显示一幅图片的时候会出现闪屏的现象,而像我们的手机就不会出现这个问题,这时我想到了书上提到的虚拟显示,所以上网查了一些资料看了一下,他们说安卓系统采用双缓冲或者多缓冲,可是找了好久就是没有找到加入多缓冲的方法,所以决定自己修改驱动程序,由于linux采用了统一的framebuffer接口,应用程序是通过framebuffer来操作调用LCD驱动,然后通过驱动来操作LCD,所以不得不分析framebuffer的驱动程序以及LCD的驱动程序。经过一天的分析源码发现LCD的默认驱动程序并没有使用LCD控制器的虚拟显示,设置帧缓冲区地址3寄存器的时候PAGEWIDTH直接赋值了LCD屏幕的宽度,在网上看了一个资料,他说的给安卓加入双缓冲支持,但是并没有详细的内容,所以我自己按着他的步骤自己写了一个函数,添加到了LCD驱动操作函数列表中,经过一天的调试可以正常运行了,LCD切换图片的时候会慢一点,但是不会出现闪屏的问题,因为使用libjpeg解码jpeg图片本身需要一定的延时,更好的处理方式还没有想到。我加入的双缓冲并没有使用LCD控制器的虚拟显示,而是使用软件的方式,通过调节帧缓冲区的起始地址实现,以后有时间的话试着通过LCD控制器直接实现多缓冲功能。

四、触摸屏控制器

在移植触摸屏驱动的时候看了驱动的源码,对ADC和触摸屏接口的操作更加了解了。S3C2410A通过ADC的模数转换实现从触摸屏物理点到数字信号的转换,博创的触摸屏是采用四线电阻式触摸屏,通过写寄存器改变引脚的接线来实现x坐标与Y坐标的转换,通过配置寄存器使ADC采用自动连续转换的方式,这样我们只要读取转后的Data值就可以了,然后能够获取到触摸屏点击的点的位置,但是这个时候并不能提供给应用程序,因为没有做滤波、防抖的处理,获取的点是不稳定的,所以要想使用触摸屏必须对原始的点进行处理,这时看资料知道大部分采用TSLIB处理触摸屏原始数据,他提供给了给应用程序的触摸屏操作的统一接口。

在分析触摸屏驱动的时候,知道了是先产生触摸屏的中断,然后触摸屏的中断传送给ADCADC开始转换然后产生中断并处理,具体执行过程现在不是太清晰了,大体还记得ADC转换程序是采样了100次然后求平均值才传送给触摸屏驱动的坐标缓冲区,然后等待应用程序来读取。

在移植tslib库的时候遇到了问题,根本找不到自己写程序的方法,在网上也找不到具体的资料,最后只好自己分析tslib中的程序然后写了自己的测试程序,能够很精准的获取坐标。

五、建议

现在看来对于这门课的学习我个人认为应该在注重原理的同时更加从应用的角度上来讲解,比方说在讲解了存储器以后可以找出uboot的源码让同学们自己把start.s分析一遍关于nand的部分,这样才能够做到学以致用,当初我们学习Nand的时候对于Nand的读写用了很长时间才明白怎么回事,如果当初看一看驱动代码的话完全可以理解的很快。还有就是我觉得ARM和驱动程序设计没必要分开,穿插着讲解或许效果更好。

六、总结

以上的对ARM的总结并没有从硬件本身的角度来写,而是从应用方面写了自己这两个周所遇到的问题,因为具体的资料我们可以在应用的时候从芯片手册或参考资料上找到,只有从应用的角度来学习才更加的深刻。这三个周以来我分析了很多源码从uboot一直到驱动程序,每分析一个就会遇到很多的问题,网上的资料是乱七八糟的,必须从那些信息中找到自己需要的,然后应用到自己的程序中。当最后完成系统构建,把自己置身事外的时候才恍然发现原来嵌入式系统并没有原来想象的那么难,就是那么几个模块,当一切熟悉以后并没有感觉多么的复杂,当然这是建立在无数次实验、总结的基础上的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值