博文

教你学会编写Linux设备驱动(2006-11-16 14:22:00)

摘要:教你学会编写Linux设备驱动 [ZZ]   内核版本: 2.4.22

阅读此文的目的: 学会编写Linux设备驱动。

阅读此文的方法: 阅读以下2个文件: hello.c,asdf.c。

此文假设读者:

已经能用C语言编写Linux应用程序,

理解"字符设备文件, 块设备文件, 主设备号, 次设备号",

会写简单的Shell脚本和Makefile。


1. "hello.c"

--------------------------------

/*

* 这是我们的第一个源文件,

* 它是一个可以加载的内核模块,

* 加载时显示"Hello,World!",

* 卸载时显示"Bye!"。


* 需要说明一点,写内核或内核模块不能用写应用程序时的系统调用或函数库,

* 因为我们写的就是为应用程序提供系统调用的代码。


* 内核有专用的函数库,如, , 等,

* 现在还没必要了解得很详细,

* 这里用到的printk的功能类似于printf。


* "/usr/src/linux"是你实际的内核源码目录的一个符号链接,

* 如果没有现在就创建一个,因为下面和以后都会用到。


* 编译它用"gcc -c -I/usr/src/linux/include hello.c",

* 如果正常会生成文件hello.o,


* 加载它用"insmod hello.o",

* 只有在文本终端下才能看到输出。


* 卸载它用"rmmod hello"

*/


/*

* 小技巧: 在用户目录的.bashrc里加上一行:

* alias mkmod='gcc -c -I/usr/src/linux/include'

* 然后重新登陆Shell,
......

阅读全文(2520) | 评论:0

c51模拟串口(2006-11-16 13:58:00)

摘要:c51模拟串口[ZZ] //作者:晒太阳的小猪   在电路设计当中,经常会感觉控制器mcu的串口sci数量太少,一般mcu的sci数量不会超过3个(其实包含有3个的就是很多的了)。要想使用更多的串口sci,就得选用硬件串口uart扩展芯片或者采用软件协议利用一般的端口来模拟sci协议。利用软件模拟的方法是最廉价的设计方法。现在把c51模拟串口sci的程序提供出来,供大家享用。 /********************************************** IO 口模拟232通讯程序,频率9600 占用定时器0 **********************************************/
#i nclude    <MAIN.h>
#i nclude    <ABSACC.h>
#i nclude    <INTRINS.h>
#i nclude    <STRING.h>
#define uint unsigned int
#define uchar unsigned char
#define REN_485 P21  //为0则可以接受,否则发送
#define TIMER0_ENABLE TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;
//#define F_TM F0
bit F_TM;
uchar time_count;
sbit BT_SND =P3^1;
sbit BT_REC =P3^0; sbit ACC0= ACC^0;
sbit ACC1= ACC^1;
sbit ACC2= ACC^2;
sbit ACC3= ACC^3;
sbit ACC4= ACC^4;
sbit ACC5= ACC^5;
sbit ACC6= ACC^6;
sbit ACC7= ACC^7; void IntTimer0() interrupt 1 using 1......

阅读全文(5088) | 评论:2

别踩static的地雷(2006-11-16 13:52:00)

摘要:只要做过项目的朋友对关键字static应该都有一些了解,但未见了解很全面的。在C语言中,关键字static有以下明显的作用:1.static变量分配到静态内存中,这一点和全局非静态变量相同。 2.在函数体,static变量只要不进行修改操作,在被调用过程中其值将保持不变。
3.在模块内,全局static变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量,具有私有特点。
4.在模块内,一个static函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用,也具有私有特点。    如果我们能够很好地利用static的这些特性,书写高内聚低耦合,更具模块化的代码就不会显得象句口号;如果不能很好地理解和使用它,一切都只是空谈。下面来举个例子来说明static在实际应用可能会遇到问题。   如果要求实现下面的接口:为每个大小约1600字节的音视频裸数据(audio/video)添加包头(packet header),然后将打过包头的整个数据包发送到网络。打过包头的数据包格式如下:                      <------packet----->                      | header | data |     我想有人可能会这么做:   #define MAX_PACKET_SIZE 1600   typedef struct _header {   bool type;  /*数据包类型*/   bool length; /*数据包类型*/  ... }header;   bool send......

阅读全文(2832) | 评论:0

一个linux设备驱动例程(2006-11-16 13:41:00)

摘要:/*
* 这个文件是一个内核模块。
* 内核模块的编译,加载和卸载在前面已经介绍了。 * 这个模块的功能是,创建一个字符设备。
* 这个设备是一块4096字节的共享内存。
* 内核分配的主设备号会在加载模块时显示。
*/ /* 开始例行公事 */
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif #include <linux/config.h>
#include <linux/module.h> #ifdef CONFIG_SMP
#define __SMP__
#endif
MODULE_LICENSE("GPL");
/* 结束例行公事 */ #include <asm/uaccess.h> /* copy_to_user(), copy_from_user */
#include <linux/fs.h> /* struct file_operations, register_chrdev(), ... */
#include <linux/kernel.h> /* printk()在这个文件里 */
#include <linux/sched.h> /* 和任务调度有关 */
#include <linux/types.h> /* u8, u16, u32 ... */ /*
* 关于内核功能库,可以去网上搜索详细资料,
*/ /* 文件被操作时的回调功能 */
static int asdf_open (struct inode *inode, struct file *filp);
static int asdf_release (struct inode *inode, struct file *filp);
static ssize_t asdf_read (struct file *filp, char *buf, size......

阅读全文(3950) | 评论:6

鼠标形状绘制分析-嵌入式开发(2006-11-16 13:35:00)

摘要: 鼠标形状绘制分析-嵌入式开发


//鼠标形状绘制分析-嵌入式开发 //鼠标所在LCD为黑、白两色屏 //鼠标形状数据结构描述如下: const uint8 Gliethttp_MouseArrow[] = {   0x50, 0x00, 0x00,      //1   0x64, 0x00, 0x00,      //2   0x69, 0x00, 0x00,      //3   0x6A, 0x40, 0x00,     //4   0x6A, 0x90, 0x00,     //5   0x6A, 0xA4, 0x00,     //6   0x6A, 0xA9, 0x00,     //7   0x6A, 0xAA, 0x40,    //8   0x6A, 0xAA, 0x90,    //9   0x6A, 0xA5, 0x54,     //10   0x69, 0xA4, 0x00,     //11   0x64, 0x69, 0x00,      //12   0x50, 0x69, 0x00,      //13   0x40, 0x1A, 0x40,     //14   0x00, 0x1A, 0x40,     //15   ......

阅读全文(2752) | 评论:0

如何编写Linux设备驱动程序(2006-11-16 13:34:00)

摘要:[转载]序言   Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它与dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便。本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。   以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正.   一、Linux device driver 的概念   系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能:   1.对设备初始化和释放.
  2.把数据从内核传送到硬件和从硬件读取数据.
  3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据.
  4.检测和处理设备出现的错误.   在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待.   已经提到,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b),表示是字符设备还蔤强樯璞?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱......

阅读全文(2376) | 评论:1

arm+linux平台开发的准备(2006-11-09 20:38:00)

摘要:下面关于arm+linux平台开发的准备,是针对开发人员来讲的。(转) 一、硬件开发的准备 1、单片机知识基础或者是计算机原理基础。 2、数字电路、模拟电路基础。 3、熟悉arm7、arm9原理。 4、会一到两种EDA软件(如PROTEL 99SE、POWERPCB等)。 5、对SDRAM、NAND FLASH、NOR FLASH、串口、USB、网络、液晶显示等硬件控制及读写原理比较了解。当然有的人不了解这些原理,而通过借鉴别人的设计也能设计出来。只是知其然,不知其所以然而已。 6、学习理解能力较强。 如果有上面这些基础,那么你就能够对arm应用的硬件做开发设计了。 二、bootloader、linux、文件系统移植及底层驱动开发的准备 1、单片机知识基础或者是计算机原理基础。 2、数字电路、模拟电路基础。 3、具备C、C++、汇编语言基础。 4、熟悉arm7、arm9原理。 5、熟悉bootloader、linux内核、linux文件系统的原理、配置、编译以及驱动程序的编写及加载过程。 6、对SDRAM、NAND FLASH、NOR FLASH、串口、USB、网络、液晶显示等硬件控制及读写原理非常了解。 7、学习理解能力强。 三、linux应用程序开发的准备 1、熟悉linux操作系统的工作原理、机制,熟悉进程、线程机制。 2、具备c、c++语言基础。 3、有的涉及串口、usb、网络、数据库编程,那么就需要有相应的基础。 4、学习理解能力强。        以上是我个人得出的做arm+linux平台开发所需要的基础和前提,可能存在错误或遗漏。请大家发表看法。        我把它分成三个方面。硬件、驱动、应用程序开发。如果三个方面都能做,那肯定是全才。由于做arm+linux开发牵涉的方方面面太多,所以进入门槛相对单片机开发要高。一旦熟悉了开发流程,也不是想象的那样困难。......

阅读全文(2993) | 评论:0

ARM9微控制器LPC3180的软硬件平台设计 (2006-11-09 20:35:00)

摘要:ARM9微控制器LPC3180的软硬件平台设计   摘要 介绍以Philips LPC3180微控制器为核心的嵌入式软硬件平台设计;对系统设计的硬件部分和软件部分进行详细的分析,并针对LPC3180芯片特性着重讨论了其软件系统构建以及系统启动流程。实验结果表明,LPC3180嵌入式系统平台结合片内硬件浮点运算单元,具有高性能的浮点运算处理能力,可满足复杂的嵌入式应用场合的要求。 
关键词 LPC3180 ARM9 软硬件平台 

      嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 

      基于ARM926EJS内核的LPC3180内部集成了丰富的外设资源,为嵌入式系统构建提供了很大的设计空间。本文结合笔者开发LPC3180嵌入式平台的实际经验,将具体介绍该系统的实现、结构组成和实验结果。
      
1  LPC3180芯片特性介绍 
     LPC3180是Philips公司新推出的一款ARM9微控制器。它采用90nm工艺技术,片内集成ARM9EJS处理器内核,具有高计算性能、低功耗的特性,这使得在很多对功耗敏感的嵌入式应用场合中仍能使用高性能的ARM9微控制器。LPC3180内核正常工作电压为1.2V,在低功耗模式下可降至0.9 V;同时,LPC3180作为一款新型的32位微控制器,其新特性还包括: 

◆  片内集成向量浮点(VFP)协处理器。LPC3180的浮点运算单元有3条独立的流水线,支持并行单精度或双精度浮点加/减、乘/除以及乘累积运算,完全兼容IEEE754标准,适用于高速浮点运算场合。 ......

阅读全文(2154) | 评论:0

DS1302C51源代码 (2006-11-09 20:29:00)

摘要:DS1302C51源代码     #include
#include #define mcuport2 P2
#define mcuport1 P1 unsigned char pd;
/*********************************************************************/
sbit T_CLK="P0"^7; /*实时时钟时钟线引脚 */
sbit T_IO="P0"^6; /*实时时钟数据线引脚 */
sbit T_RST="P0"^5; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//lcd引脚声明
/**************************************************/
sbit rs="P0"^0;
sbit rw="P0"^1;
sbit e="P0"^3;
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC = ucDa;
for(i="8"; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/***********************************************************......

阅读全文(2950) | 评论:0

最小2410 Linux系统软件(2006-09-28 22:29:00)

摘要:最小2410 Linux系统软件,由如下部分组成:
1. image-mini.tgz(http://www.arm9.net/image-mini.tgz)
解压可得:vivi-peanut zImage-peanut peanut.cramfs三个文件
特性:该内核仅支持串口和优盘主要外设,大小为494k;文件系统含有一个具有解压功能的busybox和imagerite烧写软件。利用该系统小的特点,可以使用jtag和串口即可安装;该系统主要为使用优盘更新系统而用。
使用方法:

step 1. 使用Jflash2410烧写vivi-peanut到nand flash中

step 2. 启动系统,进入运行bootlader模式

step 3. 使用bon part 0 192k 1216k对nand flash进行分区(注意不要掉电)

step 4. 使用load flash vivi x命令重新烧写vivi-peanut

step 5. 使用load flash kernel x 命令烧写内核

step 6. 使用load flash root x命令烧写文件系统

step 7. 系统烧写完毕,启动系统。

2. image-peanut.tgz(http://www.arm9.net/image-peanut.tgz)

解压可得vivi-peanut zImage-peanut peanut.fs三个文件

特性:该版本内核驱动比较齐全包含网卡(CS8900A),声卡(UDA1341TS),大容量移动存储,以及其他一些外设等,支持VFAT, FAT, CRAMFS, YAFFS, NFS等文件系统。文件系统包含一些常见的Linux命令,并带有一个madplay mp3播放软件。该系统最大的特性是具有可读写文件系统目录/opt,最大可读写空间为61M bytes,其他目录均为cramfs文件系统。

安装方法:

step 1. 把解压得到的文件复制到一个质量好一些的优盘中。

step 2. 把优盘接入到2410板上,运行mu命令以挂接和列出检查......

阅读全文(3202) | 评论:0