随笔 - 303  文章 - 883  trackbacks - 0
2009年2月
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

欢迎光临! 
闲聊 qq:1074961813

如何编写linux驱动程序(续集)-凯发k8网页登录

  • struts hibernate spring等学习 基础不扎实 可以跳到j2se学习群 37486623 请先退出该群
  • j2se学习 若人满请加到12999758 学完的可以跳到j2ee学习群 37486483 请先退出该群
  • java & .net都是热门的web技术 当然可以一起学啦 欢迎前来探讨技术 解决问题
  • 该群在发展中,踢人是经常的事情
  • 学完的可以跳到j2ee学习群 37486483 请先退出该群
  • 学无止境 好好努力! 讨论 web 技术 、 java (j2se j2ee) 、c/s编程 、 数据库 。。。。
  • 将 linux 和 c、c 编程进行到底!
  • 《think in java》 我们的最爱
  • 历史、宗教、哲学、气功、传统技艺,欢迎加入,知无不言,言无不尽!
  • 07年文祠实习群
  • arm || intel ...platform windows || linux device driver development 有一定基础方可加入
  • n维空间
  • email : java3d@126.com 群 : 12999758
  • java、vc和嵌入开发
  • c/c /windows/mfc
  • 三驾马车
  • 仙人指路
  • 弄vc和汇编的家伙
  • 同学的blog
  • 北京的朋友,和我一起创建了不少群 呵呵!
  • vc
  • 一个和我差不多大的北京女孩
  • 累了的时候啦 可以寻下开心

搜索

  •  

最新评论

 

大家好,从事工作之后,小寻很久没写什么了,现在对我来说,工作之余,研究一下技术,可能以成为一种乐趣,当人们做有益他人的事情,而不求回报,总是快乐。希望下来的内容也能给你带去快乐。  

关于嵌入式linux开发并不是一句话,或一篇文章能讲清楚的,很多事情也是如此,但有时候,就是那么一两篇文章,将我们从一个陌生领域的门外进入门内。。。。

如果没记错,以前有位兄弟在驱动的文章里提出一个问题,现在我便把它拿出来

看完你写的"驱动没什么新鲜玩意儿",我在想,ldd那本书居然还在出版,让我非常疑惑.仅仅填几个结构就是驱动程序了啊....怎么连写个积存器的动作都没....

当时我解释了很多,如今看来实在是废话,呵呵,随着对技术认识,可以简单的解释:前面的linux驱动是建立在操作系统之上的,而这位朋友所说的寄存器设置是指在嵌入式开发领域,可以说嵌入开发和驱动开发是两个交叉的学科,嵌入式开发里不一定全是驱动开发,驱动开发也不全限定在嵌入式平台。

关于linux驱动,我想需要解释一个问题,”软件是如何在硬件上跑起来的?

从软件的角度看上去,所有的硬件(寄存器)都是地址(如0x00010011),在arm上大多是32位的。那么为什么要用寄存器?举个例子,对arm9处理器做编程,通过对寄存器的编程,如:

     ldr r0 , =0x56000010

     mov r1 , #0x00000400

     str   r1 , [r0]           @设置gpbcon寄存器,将gpb5端口(引脚)设置为输出

     ldr r0   , =0x56000014

     mov r1 , #0x00000000

     str   r1 , [r0]           @设置cpbdat寄存器,使gpb5 输出为0低电平

main_loop:

     b     main_loop

我们就将gpb5设置为输出端口,并让gpb5输出低电平,在开发板上您就会看到第一个led灯被点亮。

从上面的简单例子看到,通过对寄存器的设置,目的是对硬件做配置,使硬件我们的软件所用。所以如果硬要在软件和硬件之间架起桥梁的话,那么这个桥梁便是寄存器,和那些地址了。关于这些地址,我们可以通过手册获得,有时候需要做些许计算。

在这这里大家也许更关心的是:c是如何访问硬件吧?

这里讲到的是裸跑所以必须有一段程序先对内存堆栈做一下配置,这样我们的c才能跑得起来(关于这部分,由于不是重点就不多讲了)

     #define   gpbcon    (*(volatile unsigned long *)0x56000010)

     #define   gpbdat    (*(volatile unsigned long *)0x56000014)

     int main(void)

     {

         gpbcon = 0x00000040; //设置gpbcon寄存器,将gpb5端口(引脚)设置为输出

         gpbdat = 0x00000000; //设置cpbdat寄存器,使gpb5 输出为0低电平

         return 0

}

我们可以看到它其实和前面的汇编没什么区别,只不过是比较好读罢了。

不少的处理器都为连在她周围的硬件(的寄存器),分配给他们自己的地址空间,软件便是通过地址空间来访问这些硬件。如果您很想从事这方面的开发,必要的硬件知识是不可少的^_^



地震让大伙知道:居安思危,才是生存之道。
posted on 2009-02-07 11:41 小寻 阅读(2895) 评论(3)  编辑  收藏 所属分类: 嵌入式开发

feedback:
# re: 如何编写linux驱动程序(续集)-嵌入式开发1---软件是如何在硬件上跑起来?[未登录] 2009-03-24 21:13 
不错 呵呵  回复  
  
# re: 如何编写linux驱动程序(续集)-嵌入式开发1---软件是如何在硬件上跑起来? 2009-03-31 16:12 
老兄你好:
我一个问题忙了几天了,要开发pc104总线, 我想问一下前辈如何看懂接口或总线定义图啊?  回复  
  
# re: 如何编写linux驱动程序(续集)-嵌入式开发1---软件是如何在硬件上跑起来? 2009-04-03 22:55 小寻
无语 硬件理论基础 懂了 就会看了  回复  
  
网站地图