LoveFM

导航

2011年12月20日 #

s3c2440存储控制器和地址以及启动的理解

摘要: 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。 NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。通俗的说,只给地址不行,要先命令,再给地址,才能读到NAND的数据,在一个总线完成的。 结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash. Nand Flash的命令、地址、数据都通过I/O口发送,管脚复用,这样做做的好处是,可以明显减少NAND FLASH的管脚数目,将来如果设计者想将NAND FLASH更换为更高密度、更大容量的,也不必改动电路板。在S3C2440... 阅读全文

posted @ 2011-12-20 22:29 LoveFM 阅读(4036) 评论(1) 推荐(0) 编辑

2011年12月19日 #

S3C2440的LCD编程

摘要: S3C2440的LCD编程1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的 形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通 过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、T.. 阅读全文

posted @ 2011-12-19 22:56 LoveFM 阅读(7948) 评论(0) 推荐(5) 编辑

2011年12月17日 #

如何计算Nand Flash要传入的行地址和列地址

摘要: 在介绍具体读取数据的详细流程之前,还要做一件事,那就是,先要搞懂我们要访问的地址,以及这些地址,如何分解后,一点点传入进去,使得硬件能识别才行。 此处还是以 K9F8G08U0A 为例,此 Nand Flash,一共有 8192 个块,每个块内有 64 页,每个页是 2K+64 Bytes,假设,我们要访问其中的第 7000个块中的第 64 页中的 1208 字节处的地址,此时,我们就要先把具体的地址算出来: 物理地址 = 块大小×块号+页大小×页号+页内地址 =7000×128K+64×2K+1208 =0x36B204B... 阅读全文

posted @ 2011-12-17 23:10 LoveFM 阅读(6579) 评论(3) 推荐(0) 编辑

2011年12月15日 #

嵌入式volatile关键字

摘要: 今天在看S3C2440开发板的初始化代码时,对#define A (* (volatile unsigned long *) 0x48000000这种形式的定义方式有困惑,于是求助GOOGLE大神,在网上搜到了一些文章,觉得以下三篇文章对理解这个有些作用:文章一: 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。 以 #define IOPIN (*((volatile unsigned long *) 0xE. 阅读全文

posted @ 2011-12-15 16:33 LoveFM 阅读(3050) 评论(0) 推荐(1) 编辑

2011年12月8日 #

Linux设备驱动之I/O端口与I/O内存

摘要: 一、统一编址与独立编址该部分来自于:http://blog.chinaunix.net/space.php?uid=21347954&do=blog&id=443670,感谢mason_hu的分享。 从CPU连出来一把线:数据总线、地址总线、控制总线,这把线上挂着N个接口,有相同的,有不同的,名字叫做存储器接口、中断控制接口、DMA接口、并行接口、串行接口、AD接口……一个设备要想接入,就用自己的接口和总线上的某个匹配接口对接……于是总线上出现了各种设备:内存、硬盘,鼠标、键盘,显示器…… 对于CPU而言,如果它要发数据到某个设备,其实是发到对应的接口,接口电路里有多个寄存器( 阅读全文

posted @ 2011-12-08 22:53 LoveFM 阅读(9496) 评论(0) 推荐(3) 编辑

Linux设备驱动之mmap设备操作

摘要: 1.mmap系统调用void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);功能:负责把文件内容映射到进程的虚拟地址空间,通过对这段内存的读取和修改来实现对文件的读取和修改,而不需要再调用read和write;参数:addr:映射的起始地址,设为NULL由系统指定; len:映射到内存的文件长度; prot:期望的内存保护标志,不能与文件的打开模式冲突。PROT_EXEC,PROT_READ,PROT_WRITE等; flags:指定映射对象的类型,映射选项和映射页是否可以共享。MAP_SHAR 阅读全文

posted @ 2011-12-08 20:22 LoveFM 阅读(13006) 评论(0) 推荐(4) 编辑

2011年12月4日 #

Linux高级字符设备之Poll操作

摘要: 在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问息息相关的,使用非阻塞I/O的应用程序通常会使用select和poll系统调用查询是否可对设备进行无阻塞的访问。select系统调用最终会引发设备驱动中的poll函数被执行。一、select()系统调用: 用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程。1.select()原型:int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,const struct timeval *timeout);/**@max... 阅读全文

posted @ 2011-12-04 16:54 LoveFM 阅读(12730) 评论(0) 推荐(1) 编辑

Linux设备驱动之Ioctl控制

摘要: 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力。 一、在用户空间,使用ioctl系统调用来控制设备,原型如下:int ioctl(int fd,unsigned long cmd,...);/*fd:文件描述符cmd:控制命令...:可选参数:插入*argp,具体内容依赖于cmd*/ 用户程序所作的只是通过命令码告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。二、驱动ioctl方法:int (*ioctl) (struct inode *inode,struct file *filp,unsigned int cmd,uns... 阅读全文

posted @ 2011-12-04 13:30 LoveFM 阅读(80464) 评论(7) 推荐(8) 编辑

linux设备驱动程序中的阻塞机制

摘要: 阻塞与非阻塞是设备访问的两种方式。在写阻塞与非阻塞的驱动程序时,经常用到等待队列。一、阻塞与非阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回。 非阻塞指不能立刻得到结果之前,该函数不会阻塞当前进程,而会立刻返回。 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用的函数也可以进入阻塞调用。函数select()就是这样一个例子。 二、等待队列 在linux设备驱动程序中,阻塞进程可以使... 阅读全文

posted @ 2011-12-04 11:03 LoveFM 阅读(9195) 评论(1) 推荐(1) 编辑

2011年12月3日 #

linux驱动程序中的并发控制

摘要: 现代操作系统有三大特性:中断处理、多任务处理和多处理器。这些特性导致当多个进程、线程或者CPU同时访问一个资源时,可能发生错误,这些错误是操作系统运行所不允许的。在操作系统中,内核需要提供并发控制机制,对共享资源进行保护。 在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。并发容易导致竞争的问题。竞争就是两个或两个以上的进程同时访问一个资源,同时引起资源的错误。并发控制机制有以下几种: 1.原子变量操作: 原子变量操作(分为原子整型操作和原子位操作)就是绝不会在执行完毕前被任... 阅读全文

posted @ 2011-12-03 14:23 LoveFM 阅读(3058) 评论(0) 推荐(0) 编辑