- 博客(22)
- 收藏
- 关注
转载 IO端口和IO内存
在驱动程序编写过程中,很少会注意到IO Port和IO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。1. CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编
2012-03-31 15:14:06 303
转载 驱动案例一:mini2440 LED驱动 (用ioremap实现访问CPU寄存器)
I/O 内存访问流程:1. request_mem_region() 申请IO内存2.ioremap() 将物理地址映射到虚拟地址3.ioread8() 、ioread16()、ioread32()、iowrite8()、iowrite16()、iowrite32() 读写4.iounmap() 释放虚拟内存5.release_mem_region() 释放IO内存注意:
2012-03-31 11:13:18 648
转载 *restrict 功能
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样
2012-03-29 08:38:20 613
原创 sysfs: cannot create duplicate filename '/devices/virtual/misc/leds'问题处理
在mini2440平台下加载LED驱动模块出现以下错误:[root@FriendlyARM 5-3-2]# insmod mini2440_leds_misc.ko WARNING: at fs/sysfs/dir.c:491 sysfs_add_one+0x88/0xb0()sysfs: cannot create duplicate filename '/devices/virt
2012-03-28 11:17:22 7799 3
转载 建立内核模块编译环境
驱动开发使用的是mini2440的开发板,linux内核版本为linux-2.6.32.2首先解压linux源码,拷贝配置文件cp -f config_mini2440_w35 .config (否则会出现version magic '2.6.30.4 mod_unload modversions ARMv5 ' should be '2.6.30'的版本错误)Make cle
2012-03-27 17:39:14 812
转载 构建linux根文件系统 (支持EABI)
平台工具及其版本 宿主机: Windows xp;Vmware7.1.3build-324285;虚拟机Ubuntu10.10目标平台:工装(s3c2440处理器)256M Nand Flash,64M SDRAM,2MNOR Flash交叉开发环境:arm-linux-xxx-4.3.2,支持EABIlinux kernel版本:2.6.37Busybox版本:busybox
2012-03-19 14:39:50 1893
原创 4.3.2编译器重编译linux2.6.37 (支持EABI)流程及问题记录
平台工具及其版本 宿主机: Windows xp;Vmware7.1.3build-324285;虚拟机Ubuntu10.10目标平台:工装(s3c2440处理器)256M Nand Flash,64M SDRAM,2MNOR Flash交叉开发环境:arm-linux-xxx-4.3.2,支持EABIlinux kernel版本:2.6.37因使用3.4.1交叉编译环境编译应
2012-03-19 14:38:56 775
转载 volatile的功能及应用
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。精确地说就是,系统每次用到此变量的时候都是直接从对应的内存当中读取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化。使用该关键字的例子如下:
2012-03-19 14:38:21 495
转载 arm-linux-gdb 交叉编译工具的安装使用
1、arm-linux-gcc 每一种硬件都有其对应的最好的编译工具,并不是最新的最好。其实思想很简单,就是在宿主机(PC)上编译目标板子上运行的程序。所以工具链要用目标板的,这样去编译生成可执行的二进制文件。这里有一个工具制作工具链,http://www.kegel.com/crosstool/。虽然它可以自动下,还是先下好吧自己,那个速度,呵呵。2、arm-linux-gdb
2012-03-19 14:37:41 6214
原创 ubuntu10.10下安装Kdevelop4.0
一、安装KDevelop: 使用apt-get可以很容易的得到KDevelop,具体如下: 1). apt-get install kdevelop 2). 如果你无法获取这些软件包的信息,可以尝试修改/etc/apt/sources.lst,修改后 别忘了执行apt-get update更新包索引。二、安装工具包: 使用apt-get install语句安
2012-03-19 14:36:50 1012
转载 Ubuntu 10.10下配置NFS并挂载共享目录到目标板
1、安装NFS在Ubuntu下面安装nfs,输入命令:#apt-get install nfs-kernel-server#apt-get install nfs-common安装nfs-kernel-server的时候系统会自动下载另外一个包portmap2、配置nfs配置文件是/etc/exports,主要是设置服务器的共享目录以及权限的,#sudo vim /et
2012-03-19 14:36:07 779
原创 目标板设置nfs文件开机挂载及脚本挂卸载
一、脚本设置nfs文件挂卸载,脚本内容如下:#programe:#mount or umount Ubuntu10.10 nfs folder /work#History#2012.02.17 klutz first releasePATH=/sbin:/usr/sbin:/bin:/usr/binexport PATHread -p "mount or umou
2012-03-19 14:35:04 474
原创 arm-linux-gcc半字处理编译参数
在Ubuntu10.10环境下使用arm-linux-gcc 3.4.1调试16位总线LCD屏的时候遇到问题:向总线上写数据时,无法成功赋值。在执行一条总线赋值语句时,从示波器观察nGCS1片选时,发现该信号连续2次低电平有效。将该赋值语句反汇编代码列出:arm-linux-gcc 3.4.1编译代码反汇编结果:C赋值语句:*(volatile unsigned short*)lc
2012-03-19 14:34:16 557
转载 Linux GPIO驱动相关笔记
打算跟着友善之臂的《mini2440 linux移植开发指南》来做个LED驱动,虽然LED的原理简单得不能再简单了,但是要把kernel中针对于s3c24**的GPIO的一些数据结构,还有函数搞清楚也不是那么轻松的事,所以本文主要简单地说明下LED驱动中的相关数据结构以及函数/宏的定义,并对驱动加以验证 *******************************************
2012-03-19 14:31:37 674
转载 put_user & get_user
1. put_userName put_user -- Write a simple value into user space.Synopsis put_user( x, ptr); Arguments x Value to copy to user space. ptr Destination address,
2012-03-16 15:52:02 3110
转载 对于struct file_operations中ioctl消失的学习笔记
当年看《LDD3》的时候已经注意到了书中对ioctl的评价不是很好:“ioctl调用的非结构化本质导致众多内核开发者倾向于放弃它。” ,而在这次阅读3.0代码的时候,这个成员在struct file_operations中早已消失了。这个激起了我学习的兴趣,以下是对这个ioctl的学习小结:1、消失的确切时间 ioctl的消失到底是从哪个版本开始的?网上给出的时间是2.6.36开
2012-03-16 14:48:10 464
转载 error: unknown field ‘ioctl’ specified in initializer
异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序就根本不需要查询设备的状态,这一点非常类似于硬件上的“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上一个进程接收到一个信号与处理器接收到一个中断请求是一样的。1>在把驱动从2.6.32 移植到2.6.36时 报错 /home/kern
2012-03-16 10:58:08 785
转载 cdev_alloc与cdev_init与cdev_add
内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev {struct kobject kobj; // 每个 cdev 都是一个 kobjectstruct module *owner; // 指向实现驱动的模块const struct file
2012-03-15 17:00:53 503
转载 cdev_alloc与cdev_init区别
通过cdev_alloc的代码可以看出,它主要完成了空间的申请和简单的初始化操作;[cpp] view plaincopyprint?void cdev_init(struct cdev *cdev, const struct file_operations *fops) { memset(cdev, 0, sizeof *cdev); INIT_
2012-03-15 16:53:48 88
转载 rmmod: chdir(/lib/modules): No such file or directory 解决方法
使用rmmod会出现 rmmod : chdir(/lib/modules): No such file or directory ? 现在的内核模块在插入卸载时都会要转到 “/lib/modules/内核版本号/ ” 这个目录里。所以只要建立这个目录就行了。在目标板执行#mkdir -p /lib/modules/$(uname -r)较新版本的busybox 1.13.
2012-03-14 08:59:05 7175
转载 驱动模块编译错误提示--implicit declaration of function ‘kmalloc’
编译一个驱动测试模块出现如下编译错误,make: Entering directory `/usr/src/kernels/2.6.35.6-45.fc14.i686' CC [M] /home/ty/development/driver/ch6/globalmem.o/home/ty/development/driver/ch6/globalmem.c: In function
2012-03-14 08:52:51 750
转载 hello: module license 'unspecified' taints kernel.错误--编写内核模块意见
为了后续学习的顺利进行,我们利用最简单的helloworld程序,在内核上挂载和卸载我们自己编写的hello模块。一、编写hello.c文件利用vi编辑器,我们键入下面的代码,并保存为hello.c文件。/*** hello.c* ------Test for kernel module*/#i nclude #i nclude
2012-03-14 08:51:06 920
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人