博客首页
注册
建议与交流
排行榜
加入友情链接
推荐
投诉
搜索:
帮助
再NB的肖邦,也弹不出我心中的忧伤......
It's better to burn out than to fade away!!!
tequliaSusan.cublog.cn
管理博客
发表文章
留言
收藏夹
博客圈
音乐
相册
文章
· C/C++学习
· 硬件电路
· uboot移植
· UNIX系统编程
· VIM使用与学习
· Linux网络编程
· Linux内核编程
· Linux设备驱动
· 嵌入式学习
· 杂乱心情
· Linux应用
首页
关于作者
姓名:Tequlia Lv 职业:学生 年龄:26 位置: 个性介绍:再NB的肖邦,也弹不出我心中的忧伤......
||
<<
>>
||
我的分类
文章列表 - Linux设备驱动
总结一下s3c2440上的gadget驱动
经过两个星期的学习和折腾,gadget驱动又有了新的进展。给驱动打上底版本的补丁后,从块设备上读文件是没有问题的,但是写文件操作的时候总是失败。今天用2.6.22内核版本的s3c2410_udc驱动backporting到我的内核上,可以正常工作读文件的时候没有问题,写操作的时候不会出现失败了,但是写大文件的操作的时候非常的慢啊!,这个问题还是有待解决!<br> 回顾porting的过程:下载s3c2410_udc.c的补丁+修改相关的头文件,并注意注册设备驱动的时候总线,设备和设备驱动程序之间的联系。<br>
查看全文
发表于:2008-07-03 ┆
阅读(136)
┆
评论(0)
diff和patch命令的使用
<p>1.diff的使用<br>diff可以完成比较功能,生成补丁文件<br>格式::diff [option] oldfile newfile<br>常用的option选项有:<br><span style="font-family: Tahoma;">-r 对目录进行递归比较</span><br style="font-family: Tahoma;"><span style="font-family: Tahoma;">-u 输出统一格式</span><br style="font-family: Tahoma;"><span style="font-family: Tahoma;">-N 比较目录时若一个目录文件缺失,视之为空文件</span><br style="font-family: Tahoma;"><span style="font-family: Tahoma;">-a 将所有文件视为文本文件,逐行比较</span><br>$diff -u postlogin.c postlogin-new.c >test.patch<br><br>2.patch的使用<br>patch -pnum <patchfile<br>其中num表示路径的处理方法,它将改变相对路径。假设patchfile中的文件路径是<br>src/vsftpd-2.0.1/postlogin.c<br><br>-p0 src/vsftpd-2.0.1/postlogin.c<br>-p1  ……
查看全文
发表于:2008-07-02 ┆
阅读(93)
┆
评论(0)
diff和patch命令的使用
<p>1.diff的使用<br>diff可以完成比较功能,生成补丁文件<br>格式::diff [option] oldfile newfile<br>常用的option选项有:<br><span style="font-family: Tahoma;">-r 对目录进行递归比较</span><br style="font-family: Tahoma;"><span style="font-family: Tahoma;">-u 输出统一格式</span><br style="font-family: Tahoma;"><span style="font-family: Tahoma;">-N 比较目录时若一个目录文件缺失,视之为空文件</span><br style="font-family: Tahoma;"><span style="font-family: Tahoma;">-a 将所有文件视为文本文件,逐行比较</span><br>$diff -u postlogin.c postlogin-new.c >test.patch<br><br>2.patch的使用<br>patch -pnum <patchfile<br>其中num表示路径的处理方法,它将改变相对路径。假设patchfile中的文件路径是<br>src/vsftpd-2.0.1/postlogin.c<br><br>-p0 src/vsftpd-2.0.1/postlogin.c<br>-p1  ……
查看全文
发表于:2008-07-02 ┆
阅读(77)
┆
评论(0)
S3C2440 Timer初始化方法
<p>作者:蔡于清<br><a href="http://www.another-prj.com/" target="_blank"><font color="#810081">www.another-prj.com</font></a><br><br><br>s3c2410提供了5个<b>16位</b>的Timer(Timer0~Timer4),其中Timer0~Timer3支持Pulse Width Modulation—— PWM(脉宽调制 )。Timer4是一个内部定时器(internal timer),</p><b><font color="red">PCLK是Timer的信号源</font></b>,我们通过设置每个Timer相应的<b>Prescaler</b>和<b>Clock Divider</b>把PCLK转换成输入时钟信号传送给各个Timer的逻辑控制单元(Control Logic),事实上每个Timer都有一个称为<b>输入时钟频率(Timer input clock Frequency)</b>的参数,这个频率就是通过<font color="red">PCLK,Prescaler和Clock Divider</font>确定下来的,每个Timer 的逻辑控制单元就是以这个频率在工作。下面给出输入时钟频率的公式:<br><br><b>Timer input clock Frequency = PCLK / {prescaler value+1} / {clock divider }<br>{prescaler value} = 0~255<br>{ clock divider } = 2, 4, 8, 16</b><br><br>然 而并不是每一个Timer都有对应的Prescaler和Clock Divider,从上面的原理图我们可以看到Timer0,Timer1共用一对……
查看全文
发表于:2008-06-17 ┆
阅读(145)
┆
评论(0)
S3C2410 Timer分析
<p> 转载自:http://enkunlee.blog.163.com/blog/static/204341520068257228342/</p> <p class="g_w_100 g_t_wrap g_t_center g_t_bold g_t_24 g_c_pdin c07" id="blogtitle__fks_1ghZ0UxzkkBMZ7vEWnLY-w==">ARM,S3C2410中脉宽调制定时器</p> <div class="g_blog_list"> <div class="g_t_center g_c_pdin g_p_center c07 content" id="blogtext__fks_1ghZ0UxzkkBMZ7vEWnLY-w==" style="width: 760px;"> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font face="Times New Roman">S3C2410</font></span><span style="font-family: 宋体;">有</span><span lang="EN-US"><font face="Times New Roman">5</font></span><span style="font-family: 宋体;">个</span><span lang="EN-US"><font face="Times New Roman">16bit</font></span><span style="font-family: 宋体;">定时器。定时器</span><span lang="EN-US"><font face="Times New Roman">0-3</font></span><span style="font-family: 宋体;">有脉宽调制功能(</span><span lang="EN-US"><font face="Times New Roman">Pulse Width Modulation</font></span><span style="font-family: ……
查看全文
发表于:2008-06-17 ┆
阅读(136)
┆
评论(0)
转载 Linux2.6内核驱动移植比较
<p>Linux2.6内核驱动移植</p> <p>随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要进行改写。为了方便各位Linux爱好者我把自己整理 的这分文档share出来。该文当列举了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个函数的用法。 特别声明:该文档中的内容来自<a href="http://lwn.net/">http://lwn.net</a>,</p> <p>1、 使用新的入口</p> <p>必须包含 <linux/init.h> module_init(your_init_func); module_exit(your_exit_func); 老版本:int init_module(void); void cleanup_module(voi); 2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头文件。</p> <p> </p> <p>2、 GPL</p> <p>MODULE_LICENSE("Dual BSD/GPL"); 老版本:MODULE_LICENSE("GPL");</p> <p>3、 模块参数</p> <p> </p> <p>必须显式包含<linux/moduleparam.h> module_param(name, type, perm); module_param_named(name, value, type, perm); 参数定义 module_param_string(name, string, len, perm); module_param_array(name, type, num, perm); 老版本:MODULE_PARM(variable,type); MODULE_PARM_……
查看全文
发表于:2008-06-16 ┆
阅读(87)
┆
评论(0)
S3C2410 AD分析
今天要用AD来采集电压数值,翻出来手册看看AD的功能模块。自己的英文真的很烂啊,费了好大的劲......把程序写完了,读手册的时间比写代码的时间要长好多......下面说说在ADC模块上操作要注意的几个问题:<br>(1)首先就是频率的问题,在看手册上说AD的供电是3.3, 模拟电压的输出范围是0~3.3v。 最高是10bit转化;在NOTE中有这样一句A/D转化可操作的最大的频率是2.5MHz, 那么在我们的PCLK是50MHz的时候,就可以算出分频的最小数值为19---PCLK/2.5Mhz-1。这样我们就可以根据这个数值来设置ADCCON的相应的数值。<br>(2)我们不使用standby的模式,因此将ADCCON相应设置。然后我们使用ENABLE_START方法.<br>
查看全文
发表于:2008-06-11 ┆
阅读(169)
┆
评论(0)
S3C2410外部中断处理方式
在S3C2410中有EINT0~EINT3,EINT4to7,EINT8to23一共24个外部中断源。这些都是和GPIO复用构成的。EXTINT0~EXTINT2将这些24个外部中断分成了3组,每8个外部中断有共同的属性分到一组中,通过这些寄存器可以设置外部中断的触发方式:高电平,底电平,上升沿,下降沿或者双边沿触发方式。<br> EINTMASK(External Interrupt Mask Register)外部中断屏蔽寄存器,这里reset value是和INTMSK相同的初始数值都为0x000fffff,在最初的情况下都是屏蔽的。在这个寄存器中只是设置了EINT4~EINT23。<br> EINTPEND(External Interrupt Pending Register)外部中断判决寄存器,通过这个寄存器可以判断出哪个外部中断被响应。<br>
查看全文
发表于:2008-06-10 ┆
阅读(134)
┆
评论(0)
S3C2410中断章节分析(转载)
<div class="text" id="content"> <p>在进入正题之前,我想先把ARM920T的异常向量表(Exception Vectors)做一个简短的介绍。:]<br> ARM920T的异常向量表有两种存放方式,一种是低端存放(从0x00000000处开始存放),另一种是高端存放(从0xfff000000处开始存 放)。关于为什么要分两种方式进行存放这点我将在介绍MMU的文章中进行说明,本文采用低端模式。ARM920T能处理有8个异常,他们分别是:<br> Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ<br> 下面是某个采用低端模式的系统源码片段:<br> /*****************************************************************************<br> _start:<br> b Handle_Reset<br> b HandleUndef<br> b HandleSWI<br> b HandlePrefetchAbort<br> b HandleDataAbort<br> b ……
查看全文
发表于:2008-06-10 ┆
阅读(94)
┆
评论(0)
S3C2410 中断处理方法
在驱动中经常会以中断的方式来处理数据,以前总是搞的不太清楚,今天在这里和S3C2410的中断处理来做个了结。ARM的CPU中一般都带有一个中断控制器,S3C2410也不例外。S3C2410中断控制器可以支持56个设备,其中包含内部设备和外部设备。内部设备有UART0,LCD,USB等;外部设备是EINT0/EINT1/EINT2/EINT3,这几个外部中断是各自的占有一条外部中断线;EINT4~7,4~7号外部中断共用一条数据线;EINT8~EINT23共用一条数据先,外部中断是通过GPIO复选功能来实现的。<br> 在中断处理中重要的几个寄存器:SRCPND(SOURCE PENDING REGISTER),INTPND(INTERRUPT PENDING REGISTER),INTMSK(INTERRUPT MASK REGISTER)。<br> SRCPND是中断源引脚寄存器,在一个中断异常处理流程中,中断信号传进中断异常处理模块后首先遇到的就是SRCPND,这个寄存器的作用是标志出哪个中断请求被触发。SRCPND的有效位是32位。<br> INTPND寄存器和SRCPND是相同的位设置,但是他们在中断异常处理中却扮演着不同的角色,SRCPND是中断处理经过的第一个寄存器,而INTPND是中断处理经历的最后一个寄存器。它的每一位对应着一个中断请求,若该位为1则中断请求被触发……
查看全文
发表于:2008-06-10 ┆
阅读(180)
┆
评论(0)
交叉编译busybox1.4
今天上午折腾了一下busybox的交叉编译,以前的开发板上用的busybox工具集比较的老,今天给它升级一下。本着不求最新,够用就行的原则下载了busybox1.4的版本源码包。<br> 首先就要修改Makefile文件,添加CROSS_COMPILE = /usr/local/arm/3.3.2/bin/arm-linux,事实证明这个版本的的C库和1.4的版本匹配还是非常不错的。<br> 然后进入make menuconfig, 首先要将applet前面的几行注释掉,然后选择默认的shell为ash,再根据不同的需求来选择命令。由于我用的是bash那么还要修改一下script脚本的!/bin/sh--->/bin/bash否则解析有问题。注意busybox的每次修改都需要重新的make clean,它的源码组织不像内核那么完善。<br>
查看全文
发表于:2008-06-06 ┆
阅读(148)
┆
评论(0)
看了一些IDE驱动的代码
今天看了IDE设备驱动方面的东西,在内核里是集中在driver/ide/*目录下。关于IDE驱动绝大部分的驱动代码内核开发者都完成了,主要我看是有Linus编写的东东,我们移植来说只需要很小的改动。主要集中在ide.h文件中,主要是初始化IDE控制器的功能寄存器,初始化一些基本的结构体,然后调用相关的初始化函数完成硬件的检测等动作。
查看全文
发表于:2008-06-05 ┆
阅读(99)
┆
评论(0)
开始折腾IDE驱动
我们的IDE驱动有点问题,头让我修理修理它,翻出资料,赶紧看看...... IDE是Integrated Drive Electronics的缩写,中文的意思是电子集成驱动器。它主要的目的是将硬盘控制器和盘体集成在一起,以减少硬盘接口的电缆数目和电缆长度,从而增强了数据传输的可靠性。<br> 基本的硬盘标准有4种,ST506/IDE/ESDI/SCSI。我们的板子上是IDE接口的其他的不考虑。最早的IDE硬盘为ATA-1(Advanced Technology Attachment)。随后IDE硬盘技术在此基础上又开发出了ATA-2(EIDE),ATA-3(FastATA-2),Ultra ATA, Ultra ATA/33, ultra ATA/66, Ultra ATA/100, SATA等等。这些的硬盘借口都是向下兼容的,性能不断的提高,价格也更加的低廉,从而成为了PC标准的硬盘接口。此外,SCSI接口具有不需要理解外部设备特有的物理属性就可以进行高水平逻辑操作的命令体系,比较适合作备份的工作。<br>
查看全文
发表于:2008-06-04 ┆
阅读(72)
┆
评论(0)
linux进入临界去开关中断的几种方式
进入中断时候关闭全局的中断是为了避免程序处理中断过程中,再进入另一个中断打乱执行的顺序,也就是为了防止中断嵌套的情况发生。比如在irq_handler函数中首先就应该关闭中断。或者,在某些操作顺序中是不允许中断发生打断的情况。例如在驱动中常用的方式:<br> unsigned int flag;<br> local_irq_save(&flag);<br> ... ... ... ...<br> local_irq_restore(&flag);<br> spin_loc_irqsave 禁止中断(只在本地处理器)在获得自旋锁之前; 之前的中断状态保存在 flags 里. 如果你绝对确定在你的处理器上没有禁止中断的(或者, 换句话说, 你确信你应当在你释放你的自旋锁时打开中断), 你可以使用 spin_lock_irq 代替, 并且不必保持跟踪 flags. 最后, spin_lock_bh 在获取锁之前禁止软件中断, 但是硬件中断留作打开的。感觉现在自己对互斥和中断的关系给搞糊涂了......例如出现这样的情况,在进入临界区后,发生了一个中断在进入中断处理函数中,也需要临界区的资源,但是它获得不了,是不是这个中……
查看全文
发表于:2008-06-01 ┆
阅读(99)
┆
评论(0)
container_of()在内核中的应用
在设备驱动程序中,在用open函数打开时候,首先就要确定要具体打开的设备。其中的inode参数在i_cdev字段中包含了我们所需要的信息,就是我们先前设置的cdev的结构。唯一的问题是,通常不需要cdev结构本身,而是希望得到包含cdev结构的设备原始结构,在ldd3中就是scull_dev结构。实现此技巧的就是通过在<linux/kernel.h>中的container_of宏来实现:<br> container_of(pointer, container_type, container_field);<br><br>struct scull_dev *dev; /*device information*/<br>dev = container_of(inode->i_cdev, struct scull_dev, cdev);<br>filp->private_data = dev /*for other method*/<br>一旦代码找到scull_dev结构后,scull将一个指针保存到了file结构的private_data字段中,这样可以方便以后对该指针的访问。<br>
查看全文
发表于:2008-05-07 ┆
阅读(94)
┆
评论(0)
调试串口遇到的搞笑事情
今天准备调试一个多串口程序,由于开发板上没有接MAX芯片不能够用串口和PC机之间通讯,考虑采用的方法是将TxD和RxD短接,然后在终端上打印接收到的信息。自己写了两个测试程序test_read和test_write。将test_write在开发板系统的后台运行,不停的发数据。将test_read在前台运行不停的接收,然后我就将两个引脚短接上,搞笑的事情开始了,我傻乎乎的按照原理图中画的方向来短接两个引见,发现什么数据也收不到!!!<br> 我首先开始怀疑TxD没有正常工作,用示波器扫了一下,显示正常发送数据。然后我又开始怀疑是测试程序有问题,有调了调程序,并没有发现问题,这样我就开始郁闷了........又开始怀疑这种自回环的方法是否可行,在网上查了查,没有什么问题啊继续郁闷ing.........<img src="http://www.cublog.cn/images/face/013.gif">, 做点事情咋就这么困难呢?----(从这件事情上看出我是一个拥有悲观情绪的人,这点上我要学习杨头,他身上就有种无所畏惧,永往直前的精神!!!!)<br> 世界上的事情就是这么难以预料,要相信阳光总在风雨后 哈哈,就在俺郁闷的时……
查看全文
发表于:2008-04-19 ┆
阅读(166)
┆
评论(2)
Linux usb键盘驱动学习
目前这两天一直在看2.6内核下的usb键盘驱动程序,遇到了困难。不要放弃,不要想当然的认为自己懂了,记住这句话:浮躁的人永远也成不了高手!!!
查看全文
发表于:2008-01-23 ┆
阅读(334)
┆
评论(1)
USB的描述符及各种描述符之间的依赖关系(转载)
描述符都有自己独立的编号,如下:<br>#define DEVICE_DESCRIPTOR 0x01 //设备描述符<br>#define CONFIGURATION_DESCRIPTOR 0x02 //配置描述符<br>#define STRING_DESCRIPTOR 0x03 //字符串描述符<br>#define INTERFACE_DESCRIPTOR 0x04 //接口描述符<br>#define ENDPOINT_DESCRIPTOR 0x05 //端点描述符<br> <br>下面分别详细介绍一下各描述符。 <p>1.设备描述符</p> <p>//定义标准的设备描述符结构</p> <p>typedef struct _DEVICE_DCESCRIPTOR_STRUCT<br>{<br> BYTE blength; &nbs……
查看全文
发表于:2008-01-22 ┆
阅读(250)
┆
评论(0)
USB设备总线枚举的过程
当USB设备插拔时候,主机会使用称为总线枚举的过程来识别和管理设备。当USB设备插入端口时,主机所要作的事情是:<br>(1) USB设备通过所连接的集线器向主机报告连接事件,此时,设备处于上电的状态,而连接的端口处于禁止的状态。<br>(2) 主机通过查询集线器端口确定变化的类型。<br>(3) 主机等待100ms让设备的电源变得稳定,然后向端口发出复位命令。<br>(4) 集线器在该端口执行复位处理,复位完成后激活该端口。此时,USB设备处于默认状态。<br>(5) 主机给设备分配一个唯一的地址,使设备进入寻址状态。<br>(6) 在USB设备接受到唯一的地址前,主机仍可以以默认控制管道和地址访问设备。主机读出设备描述符,确定设备默认管道的实际最大数据的有效负载。<br>(7) 通过读0~n-1个配置,主机可查找到设备的配置。<br>(8) 主机给设备分配一个配置值,使设备处于配置状态。从设备的观点来看,它已经可以使用了。<br>
查看全文
发表于:2008-01-12 ┆
阅读(226)
┆
评论(0)
什么是MTD?
<DIV>软件支持<BR> 当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法的软件,包括性能优化。在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。使用NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于NOR器件的更高级软件,这其中包括M-System的TrueFFS驱动,该驱动被Wind River System、Microsoft、QNX Software System、Symbian和Intel等厂商所采用。驱动还用于对DiskOnChip产品进行仿真和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。</DIV> <DIV> MTD 设备是象闪存芯片、小型闪存卡、记忆棒等之类的设备,它们在嵌入式设备中的使用正在不断增长。 MTD 驱动程序是在 Linux 下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序,使用 MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的支持、更好的管理和基于扇区的擦除和读写操作的更好的接口。Linux 下的 MTD 驱动程序接口被划分为两类模块:用户模块和硬件模块。……
查看全文
发表于:2007-04-16 ┆
阅读(617)
┆
评论(0)