博文
教你学会编写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,
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
别踩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......
一个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......
鼠标形状绘制分析-嵌入式开发(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
......
如何编写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),表示是字符设备还蔤强樯璞?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱......
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开发牵涉的方方面面太多,所以进入门槛相对单片机开发要高。一旦熟悉了开发流程,也不是想象的那样困难。......
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标准,适用于高速浮点运算场合。 <......
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;
}
}
/***********************************************************......
最小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命令以挂接和列出检查......