linux简单的gpio驱动实例

linux简单的gpio驱动实例
linux简单的gpio驱动实例

今天完成了嵌入式linux的第一个驱动的编写和测试,虽然是个简单的程序,

但是麻雀虽小,五脏俱全,希望可以给刚开始接触驱动编写的人一些提示,共

同进步。

源代码:

分析如下:

下面是我的驱动程序:

#include //配置头文件

#include /*内核头文件,作为系统核心的一部分,设备驱动程序在申请和释放内存时,不是调用malloc和free,而是调用kmalloc和

kfree*/

#include //调度,进程睡眠,唤醒,中断申请,中断释放

#include //时钟头文件

#include //用户定义模块初始函数名需引用的头文件

#include //模块加载的头文件

#include

#include //这个是2440的寄存器头文件,asm/srch只是个链接

//实际根据自己的情况查找,一般

是../../linux2.*.*/include/asm/arch-s3c2440里编译器

//自己会查询链接,以前不知道,找了半天

// GPIO_LED DEVICE MAJOR

#define GPIO_LED_MAJOR 97 //定义主设备号

//define LED STATUS 我的板子 LED在GPB0 与GPB1 处大家根据自己情况改

#define LED_ON 0 //定义LED灯的状态开

#define LED_OFF 1 //

// ------------------- READ ------------------------ 这个前面要加static 否则警告

static ssize_t GPIO_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)

{

return count;

}

// ------------------- WRITE -----------------------

static ssize_t GPIO_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)

{

return count;

}

// ------------------- IOCTL -----------------------

static ssize_t GPIO_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data) //这个函数实现了led灯亮灭的接口{

switch (cmd)

{

case LED_ON : { GPBDAT =0x01; break;} //根据自己情况修改一个亮一个灭

case LED_OFF: { GPBDAT =0x02; break;} //交替闪烁

default :

{printk ("lcd control : no cmd run [ --kernel-- ]\n"); return (-EINVAL);} }

return 0;

}

// ------------------- OPEN ------------------------

static ssize_t GPIO_LED_open (struct inode * inode ,struct file * file) {

MOD_INC_USE_COUNT;

return 0;

}

// ------------------- RELEASE/CLOSE ---------------

static ssize_t GPIO_LED_release (struct inode * inode ,struct file * file)

{

MOD_DEC_USE_COUNT;

return 0;

}

// -------------------------------------------------

struct file_operations GPIO_LED_ctl_ops ={

open: GPIO_LED_open, //这段赋值代码必须放在接口函数申明之后

read: GPIO_LED_read, //否则编译不过去

write: GPIO_LED_write,

ioctl: GPIO_LED_ioctl,

release: GPIO_LED_release,

};

// ------------------- INIT ------------------------

static int GPIO_LED_CTL_init(void)

{

int ret = -ENODEV;

printk("--------------------------------------------\n\n");

GPBCON = 0x0005; // 设置端口为I/O输出模式

GPBUP = 0xff; // 关闭上拉功能

GPBDAT = 0xf; //初始值为高电平熄灭LED灯

ret = register_chrdev(GPIO_LED_MAJOR, "gpio_led_ctl",

&GPIO_LED_ctl_ops);

//这个驱动注册函数必须放在复制接口的那个结构体之后

if( ret < 0 )

{

printk (" S3C2410: init_module failed with %d\n", ret);

return ret;

}

else

{

printk("S3C2410 gpio_led_driver register success!!! \n");

}

return ret;

}

static int __init S3C2410_GPIO_LED_CTL_init(void)

int ret = -ENODEV;

ret = GPIO_LED_CTL_init();

if (ret)

return ret;

return 0;

}

static void __exit cleanup_GPIO_LED_ctl(void)

{

unregister_chrdev (GPIO_LED_MAJOR, "gpio_led_ctl" );

}

module_init(S3C2410_GPIO_LED_CTL_init);

module_exit(cleanup_GPIO_LED_ctl);

完了编译这个驱动函数

makefile如下:

#################################################

# config

# where the kernel sources are located 这是我的内核头文件的路径根据自己的修改

KERNEL_DIR := ../../../linux-2.4.20

#################################################

# some magic for using linux kernel settings

# when compiling module(s)

# for new-style kernel Makefiles (2.4)

export-objs := led.o //要编译好的对象

list-multi :=

obj-m := led.o

here:

(cd $(KERNEL_DIR); make SUBDIRS=$(PWD) modules) //make

clean:

-rm -f *.o .*.o.flags *~

include $(KERNEL_DIR)/Rules.make //make的规则根据自己的情况修改

编译好以后,接下来就是测试是否可以使用驱动了

测试函数如下:

#include

#include

#include

#include // open() close()

#include // read() write()

#define DEVICE_NAME "/dev/gpio_led_ctl" //这是设备驱动名字,一会要建立

//define LED STATUS

#define LED_ON 0

#define LED_OFF 1

//------------------------------------- main

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

int main(void)

{

int fd;

int ret;

char *i;

printf("\nstart gpio_led_driver test\n\n");

fd = open(DEVICE_NAME, O_RDWR);

printf("fd = %d\n",fd);

if (fd == -1)

{

printf("open device %s error\n",DEVICE_NAME);

}

else

{

while(1)

{ ioctl(fd,LED_OFF); //GPB0亮 GPB1灭

sleep(1); //等待1秒再做下一步操作 ioctl(fd,LED_ON); //反过来

sleep(1);

}

// close

ret = close(fd);

printf ("ret=%d\n",ret);

printf ("close gpio_led_driver test\n");

}

return 0;

}// end main

makefile如下:

CROSS = /opt/host/armv4l/bin/armv4l-unknown-linux-

//交叉编译工具路径根据自己修改

CC = $(CROSS)gcc

AR = $(CROSS)ar

STRIP = $(CROSS)strip

EXEC = test //生成的可执行文件

OBJS = test.o

all: $(EXEC)

$(EXEC): $(OBJS)

$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBM) $(LDLIBS) $(LIBGCC) -lm //编译

clean:

-rm -f $(EXEC) *.elf *.gdb *.o

接下来就是最后的调试了:

首先把生成的led.o和test载到板子上

然后:

insmod led.o //成功的话,会打印sucess

lsmod //查看内核里面是否已经有led驱动模块

mknod /dev/gpio_led_ctl c 97 1 //新建LED的测试设备节点,给test.c

使用

// /dev/gpio_led_ctl 是打开的设备名称,要和测试代码匹配

// c代表字符设备

// 97是主设备好,与驱动程序匹配 1是从设备号只有一个选1

最后执行:

./test //成功了会打印一些信息这是你会看到你的板子上 LED交替亮灭间隔1s

补上一点“

/opt/FriendlyARM/mini2440/linux-2.6.29/arch/arm/plat-s3c24xx/include /plat/map.h

这个是linux2.6.69内核下的24X0寄存器定义头文件,里面定义了特殊功能寄存器的PA向VA的映射。记在这里,免得以后又找不到了。

在2.6.29上,S3C24xx相关的头文件存放于下面这些目录中

arch/arm/mach-s3c2410/include

arch/arm/mach-s3c2400/include

arch/arm/mach-s3c2412/include

arch/arm/mach-s3c2440/include

arch/arm/mach-s3c2442/include

arch/arm/mach-s3c2443/include

arch/arm/plat-s3c24xx/include

arch/arm/plat-s3c/include

例如:s3c2410_gpio_cfgpin

为什么是 S3C2410 的呢?因为三星出品的 S3C2440 芯片所用的寄存器名称以及资源分配大部分和 S3C2410 是相同的,在目前各个版本的 Linux 系统中,也大都采用了相同的函数定义和宏定义。

它们从哪里定义?细心的用户或许很快就想到它们和体系结构有关,因此你可以在linux-2.6.32.2/arch/arm/mach-s3c2410/include/mach/hardware.h 文件中找到该函数的定义,关于该函数的实际实现则可以在linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c 中找到,

监控软件设备驱动程序的编程与实现

监控软件设备驱动程序的编程与实现 0 前言 在专业监控软件出现以前,自动控制系统集成人员的一个重要任务就是编写专门的系统上位监控程序。但是,在实际工程中我们发现:一方面,由于各编程人员的水平参差不齐,许多软件的功能和可靠性都存在问题;另一方面,由于每个编程人员的编程习惯和编程思路都不同,程序的可读性和功能的扩展性都比较差。因此,功能强大、实用面广的专业监控软件就应运而生。如MCGS监控软件、组态王控软件等。由于现场智能仪表、采集板的多种多样,监控软件自带的设备驱动程序毕竟有限,因此编制设备驱动程序就成了自控系统集成工程师的重要工作之一。 本文以北京昆仑通态公司开发的MCGS为例来说明监控软件设备驱动程序的一般思路。MCGS是基于Windows95和WindowsNT平台,为用户提供了从数据采集到数据处理、报警处理、流程控制、动画显示、报表输出等解决实际工程问题的完整方案和操作工具。MCGS允许用户在VisualBasic中操作MCGS中的对象,提供了一套开放的可扩充接口,用户可根据自己的需要用VB编制特定的功能构件来扩充系统的功能。 1接口原理 许多组态软件提供了设备驱动程序软件开发包,支持用户用VB、VC、Delphi等高级编程语言编制设备驱动程序。MCGS组态软件驱动程序编程原理框图如图1所示: 几乎所有的PLC、智能仪表、采集板卡都提供了驱动软件,有的在说明书中还提供了驱动软件的核心代码、函数或数据结构。而监控软件也提供了开放性的可扩充接口,一般包括属性函数、方法函数、IO端口操作函数和串口操作函数等。在运行模式下,监控软件定时或在事件激发时调用设备驱动程序,而设备驱动程序根据需要,再调用设备核心函数。例如,MCGS在组态模式下按在线帮助按钮就会调用GetDevHelp接口,显示设备构件的在线帮助;按内部属性按钮时就会调用SetDevPage接口,显示设备构件的特定属性页。在运行环境下,MCGS首先调用一次InitDevRun接口对设备进行一些必须的初始化工作。

驱动程序

linux 驱动程序设计实验 一实验目的 1.了解LINUX操作系统中的设备驱动程序的组成 2.编写简单的字符设备驱动程序并进行测试 3.编写简单的块设备驱动程序并进行测试 4.理解LINUX操作系统的设备管理机制 二准备知识 1. LINUX下驱动程序基础知识 Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。 我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载. 而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM (高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。 系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block (块)型设备文件、Character(字符)型设备文件和Socket (网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket 接口。 设备文件都放在/dev目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda表示第一个IDE 接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc 表示第二个IDE接口的主设备。对于Block和Character型设备,使用主(Major)和辅(minor)设备编号来描述设备。主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一

Linux设备驱动程序学习(5)-高级字符驱动程序操作[(2)阻塞型IO和休眠]

Linux设备驱动程序学习(5)-高级字符驱动程序操作[(2)阻 塞型I/O和休眠] Linux设备驱动程序学习(5) -高级字符驱动程序操作[(2)阻塞型I/O和休眠]这一部分主要讨论:如果驱动程序无法立即满足请求,该如何响应?(65865346) 一、休眠 进程被置为休眠,意味着它被标识为处于一个特殊的状态并且从调度器的运行队列中移走。这个进程将不被在任何CPU 上调度,即将不会运行。直到发生某 些事情改变了那个状态。安全地进入休眠的两条规则: (1)永远不要在原子上下文中进入休眠,即当驱动在持有一个自旋锁、seqlock或者RCU 锁时不能睡眠;关闭中断也不能睡眠。持有一个信号量时休眠是 合法的,但你应当仔细查看代码:如果代码在持有一个信号量时睡眠,任何其他的等待这个信号量的线程也会休眠。因此发生在持有信号量时的休眠必须短暂, 而且决不能阻塞那个将最终唤醒你的进程。 (2)当进程被唤醒,它并不知道休眠了多长时间以及休眠时发生什么;也不知道是否另有进程也在休眠等待同一事件,且那个进程可能在它之前醒来并获取了 所等待的资源。所以不能对唤醒后的系统状态做任何的假设,并必须重新检查等待条件来确保正确的响应。 除非确信其他进程会在其他地方唤醒休眠的进程,否则也不能睡眠。使进程可被找到意味着:需要维护一个称为等待队列的数据结构。它是一个进程链表,其中饱含了等待某个特定事件的所有进程。在Linux 中,一个等待队列由一个wait_queue_head_t 结构体来管理,其定义在中。 wait_queue_head_t 类型的数据结构非常简单: 它包含一个自旋锁和一个链表。这个链表是一个等待队列入口,它被声明做wait_queue_t。wait_queue_head_t包含关于睡眠进程的信息和它想怎样被唤

Linux设备驱动程序举例

Linux设备驱动程序设计实例2007-03-03 23:09 Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间 建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设 备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设 备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子 来说明设备驱动程序的设计。 1、程序清单 //MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ #define __KERNEL__//按内核模块编译 #endif #ifndef MODULE #define MODULE//设备驱动程序模块编译 #endif #define DEVICE_NAME "MyDev" #define OPENSPK 1 #define CLOSESPK 2 //必要的头文件 #include //同kernel.h,最基本的内核模块头文件 #include //同module.h,最基本的内核模块头文件 #include //这里包含了进行正确性检查的宏 #include //文件系统所必需的头文件 #include //这里包含了内核空间与用户空间进行数据交换时的函数宏 #include //I/O访问 int my_major=0; //主设备号 static int Device_Open=0; static char Message[]="This is from device driver"; char *Message_Ptr; int my_open(struct inode *inode, struct file *file) {//每当应用程序用open打开设备时,此函数被调用 printk ("\ndevice_open(%p,%p)\n", inode, file); if (Device_Open) return -EBUSY;//同时只能由一个应用程序打开 Device_Open++; MOD_INC_USE_COUNT;//设备打开期间禁止卸载 return 0; } static void my_release(struct inode *inode, struct file *file)

触摸屏接口硬件编写驱动程序

尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。 触摸屏如今随处可见。工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。我们平时不经意间都会用到触摸屏。在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。 本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。 触摸屏作为输入手段的优点和缺点 没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。 首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。同时触摸屏也非常直观。当用户想要选择A选项时,他伸出手指碰一下A 选项就可以了。这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。 最后要说的是,触摸屏作为输入装置和系统固定在了一起。如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。 再说缺点,触摸屏可能会在不合适的场合下被错误的使用。这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。 第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。图1说明了这个问题。我能想到的最佳例子是典型的“免下 车”ATM机。这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。为了保护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强化玻璃。 触摸屏是不能这样保护的。如果真这样做的话,用户就无法进行触摸了。因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。这就造成了触摸层和显示层之间的物理隔离。如果用户以某个角度观看屏幕,就意味着用户按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的距离偏差。

Linux驱动程序工作原理简介

Linux驱动程序工作原理简介 一、linux驱动程序的数据结构 (1) 二、设备节点如何产生? (2) 三、应用程序是如何访问设备驱动程序的? (2) 四、为什么要有设备文件系统? (3) 五、设备文件系统如何实现? (4) 六、如何使用设备文件系统? (4) 七、具体设备驱动程序分析 (5) 1、驱动程序初始化时,要注册设备节点,创建子设备文件 (5) 2、驱动程序卸载时要注销设备节点,删除设备文件 (7) 参考书目 (8) 一、linux驱动程序的数据结构 设备驱动程序实质上是提供一组供应用程序操作设备的接口函数。 各种设备由于功能不同,驱动程序提供的函数接口也不相同,但linux为了能够统一管理,规定了linux下设备驱动程序必须使用统一的接口函数file_operations 。 所以,一种设备的驱动程序主要内容就是提供这样的一组file_operations 接口函数。 那么,linux是如何管理种类繁多的设备驱动程序呢? linux下设备大体分为块设备和字符设备两类。 内核中用2个全局数组存放这2类驱动程序。 #define MAX_CHRDEV 255 #define MAX_BLKDEV 255 struct device_struct { const char * name; struct file_operations * fops; }; static struct device_struct chrdevs[MAX_CHRDEV]; static struct { const char *name; struct block_device_operations *bdops; } blkdevs[MAX_BLKDEV]; //此处说明一下,struct block_device_operations是块设备驱动程序内部的接口函数,上层文件系统还是通过struct file_operations访问的。

一个简单的演示用的Linux字符设备驱动程序.

实现如下的功能: --字符设备驱动程序的结构及驱动程序需要实现的系统调用 --可以使用cat命令或者自编的readtest命令读出"设备"里的内容 --以8139网卡为例,演示了I/O端口和I/O内存的使用 本文中的大部分内容在Linux Device Driver这本书中都可以找到, 这本书是Linux驱动开发者的唯一圣经。 ================================================== ===== 先来看看整个驱动程序的入口,是char8139_init(这个函数 如果不指定MODULE_LICENSE("GPL", 在模块插入内核的 时候会出错,因为将非"GPL"的模块插入内核就沾污了内核的 "GPL"属性。 module_init(char8139_init; module_exit(char8139_exit; MODULE_LICENSE("GPL"; MODULE_AUTHOR("ypixunil"; MODULE_DESCRIPTION("Wierd char device driver for Realtek 8139 NIC"; 接着往下看char8139_init( static int __init char8139_init(void {

int result; PDBG("hello. init.\n"; /* register our char device */ result=register_chrdev(char8139_major, "char8139", &char8139_fops; if(result<0 { PDBG("Cannot allocate major device number!\n"; return result; } /* register_chrdev( will assign a major device number and return if it called * with "major" parameter set to 0 */ if(char8139_major == 0 char8139_major=result; /* allocate some kernel memory we need */ buffer=(unsigned char*(kmalloc(CHAR8139_BUFFER_SIZE, GFP_KERNEL; if(!buffer { PDBG("Cannot allocate memory!\n"; result= -ENOMEM;

驱动程序的接口设计

驱动程序的接口设计 WinCE下的驱动皆以动态链接库的形式存在。驱动实现中可以调用所有的标准API。WinCE的两种驱动模型——本机驱动模型和流接口驱动模型——其中本机驱动模型用于低级、内置设备,实现一组特定的接口函数;而流接口驱动模型是基本的驱动类型,提供一组通用设备接口,适用于多种设备。本设计采用的ADC驱动为数据采集驱动,是整个数据采集系统的核心。首先介绍几个流接口驱动的接口函数: (1)ADC_Init: 函数原型:DWORD ADC_Init(LPCTSTR Identifier) 功能描述:软件资源初始化,硬件地址空间映射,硬件初始化,中断注册。 参数描述:Identifier为字符串指针,指向本驱动在注册表标识符路径键值。 实现要点:本函数的关键部分在于对硬件地址空间的映射,通Virtualalloc,Viirtualcopy将I/O寄存器、中断寄存器、PWM寄存器和存储器地址空间映射到系统内存空中去;此外还要对硬件进行系统启动后的第一次初始化,包括中断硬件初始化和注册、fifo的清零和采集的禁止等。注意为保证系统的稳定和低功耗,在本函数运行后,数据采集器处于禁止中断和电源关闭状态。 具体使用:ADC_Init会把设备内容指针传递给ADC_Open。 (2)ADC_Deinit: 函数原型:BOOL ADC_Deinit(PADC_Info pContext) 功能描述:软件资源释放,硬件反初始化,中断屏蔽。 参数描述:pContext是驱动软件结构体指针。 实现要点:本函数为ADC_Init的逆向操作。 具体使用:释放了ADC_Init中分配的资源。 (3)ADC_Open: 函数原型:DWORD ADC_Open(DWORD pContext,DWORD AccessCode,DWORD ShareMode) 功能描述:打开设备,AD上电,禁止中断,禁止触发,清除FIFO,数据缓冲区初始化。 参数描述:pContext是驱动软件结构体指针;AccessCode为读写访问权限。 制模式码:ShareMode为共享访问权限控制模式码。 应用接口:CreateFile 实现要点:本函数主要功能是开启设备电源,并确保其初始化状态可靠,因此其中部分操作与系统初始化阶段类似。注意在本操作结束后,采集器仍处于禁

USB驱动程序安装说明

USB编程电缆驱动程序安装说明 概述 USB编程电缆或USB接口产品是通过将电脑的USB接口模拟成传统的串行口(通常为COM3),从而使用现有的编程软件或通信软件,通过编程电缆与PLC 等设备的传统接口进行通信。 功能 ●支持的操作系统Windows2000/Windows XP ●完全兼容USB 2.0规范 ●USB总线供电(非隔离产品)、或USB总线供电与PLC的编程口同时供 电(隔离型产品) ●波特率:300bps~1Mbps自动适应 ●每台PC只支持一个USB接口转换产品(如一台电脑需使用多个USB 接口产品,需为各个USB接口产品设置不同的序列号,请咨询生产厂家 索取序列号设置工具软件) 系统要求 请在使用USB编程电缆之前确认你的电脑是IBM PC兼容型并具备以下最低系统要求: ●Intel兼容586DX4-100MHz中央处理器或更高 ●一个标准的USB接口(4-pin A型插座) ●运行操作系统为Windows2000或Windows XP 驱动程序的安装 驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行: 1、打开将要连接USB编程电缆或USB接口产品的电脑电源,并确认电脑 的USB口已经启动并正常工作。 2、将USB编程电缆或USB接口产品插入电脑的USB接口,Windows将检 测到设备并运行添加新硬件向导帮助你设置新设备,插入驱动程序光盘 并单击下一步继续。 如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中, 展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键 并运行更新驱动程序。

am335x_linux-3.14.43内核移植笔记

本文主要描述在EVB335X-II以Device Tree的方式移植新TI官网AM335X系列最新的linux-3.14.43版本内核以及移植Debian文件系统的过程及遇到的一些问题。整个Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式(即.dts文件),又增加 了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux 内核。以下是修改步骤: 一、修改uboot,支持Device Tree EVB335X-II在linux-3.2版本内核移植的时候已经有uboot,因此只需在该uboot上增加Device Tree支持即可,以下是修改步骤: 1、修改include/configs/com335x.h文件,增加支持DT的宏定义: /* Flattened Device Tree */ #define CONFIG_OF_LIBFDT 2、修改uboot启动参数,增加dtb文件的加载和启动(由于目前只是移植EMMC版本的EVB335X-II,因此只需修改EMMC的启动参数即可,大概在405行),修改如下: #elif defined(CONFIG_EMMC_BOOT) #define CONFIG_BOOTCOMMAND \ "run mmcboot;" #define CONFIG_EXTRA_ENV_SETTINGS \ "lcdtype=AUO_AT070TN94\0" \ "console=ttyO0,115200n8\0" \ "mmcroot=/dev/mmcblk0p2 rw\0" \ "mmcrootfstype=ext4 rootwait\0" \ "mmcargs=setenv bootargs console=${console} noinitrd root=${mmcroot} rootfstype=${mmcrootfstype} lcdtype=${lcdtype} consoleblank=0\0" \ "mmcdev=" MMCDEV "\0" \ "loadaddr=0x81000000\0" \ "dtbfile=evb335x-ii-emmc.dtb\0" \ "bootenv=uEnv.txt\0" \ "bootpart=" BOOTPART "\0" \ "loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \ "importbootenv=echo Importing environment from mmc ...; " \ "env import -t $loadaddr ${filesize}\0" \ "loadaddr-dtb=0x82000000\0" \ "loadimage=load mmc ${bootpart} ${loadaddr} uImage\0" \ "loaddtb=load mmc ${bootpart} ${loadaddr-dtb} ${dtbfile}\0" \ "mmcboot=mmc dev ${mmcdev}; " \ "if mmc rescan; then " \ "echo SD/MMC found on device ${mmcdev};" \ "if run loadbootenv; then " \ "echo Loaded environment from ${bootenv};" \ "run importbootenv;" \ "fi;" \ "run mmcargs;" \

嵌入式系统接口设计与Linux驱动程序开发

嵌入式系统接口设计和Linux驱动程序开发 书名:嵌入式系统接口设计和Linux驱动程序开发 作者:刘淼 出版社:北京航天航空大学出版社 ISBN:9787810778619 定价:39.00 元 出版日 2006-5-1 期: 编辑推荐 Linux是源码开放的操作系统,它发展迅速,爱好者众多,同时也是主流的嵌入式操作系统之一。以ARM 为核心的处理器使用广泛,成本低廉,软件支持好,也是当今市场占有率最高的32位嵌入式处理器。本书Linux和ARM处理器平台为例,结合两大主流软件和硬件,讲述嵌入系统开发的相关知识,是对深入学习嵌入式系统很有借鉴意义的书。 内容简介 本书针对ARM处理器为核心的主流嵌入式系统平台,主要讲述嵌入式Linux驱动程序的设计和开发过程。内容同时涵盖嵌入式系统的软硬件两个方面:一方面是嵌入式系统常用的硬件接口时序、电气特性等内容的分析;另一方面讲述对应硬件的Linux驱动程序实现方法。本书共分为16章。第1、2章介绍嵌入式系统和Linux驱动程序的基础性知识。从第3章开始,详细讲述硬件平台及其对应的Linux驱动程序。硬件包括I/O口、CAN总线、触摸屏、I2CPS/2、异步串口、音频、显示、IDE、PCMCIA、USB、以太网以及Flash 的使用等内容。软件涉及针对上述硬件的各种驱动程序在Linux下的体系结构,Linux的字符设备、块设备和网络设备驱动程序,ARM Linux的中断处理,BootLoader和内核的启动过程等。 本书可作为机器人技术、机电控制系统、信息家电、工业控制、手持设备、智能玩具、医疗仪器等方面嵌入式系统开发和使用的参考书,也可作为高等院校有关嵌入式系统教学的本科生或研究生的教材。 作者简介 刘焱,吉林省吉林市人。2000年开始从事嵌入式系统方面的研发工作,参加过多项国家863、自然基金研究项目,熟练掌握ARM等RISC微处理器系统的硬件设计及LinuxWinCEVxWorks等操作系统的软件设计.尤其擅长硬件接口和驱动程序等系统底层架构设计。先后主持过基于S3C4480、S3C2410、PXA270等多款嵌入式教学实验平台及基于HMS30C7202.AT91 RM9200的工业测控系统的开发工作,作为主要研究人员完成的嵌入式数控系统已在企业成功使用。曾担任过清华大学软件学院、北京航空航天大学软件学院嵌入式系统课程的实验教学工作及南开大学软件学院的嵌入式系统专业课程教学工作。现任中国电子学会嵌入式系统培训中心ESTC认证讲师。 目录 第1章典型的嵌入式系统体系结构 1.1嵌入式系统概述1 1.2嵌入式系统的组成1 1.2.1嵌入式平台的硬件架构2 1.2.2板级支持包和嵌入式系统2 1.2.3嵌入式系统上的使用程序3 1.3嵌入式系统的开发流程和优势3 1.4嵌入式系统的方案选择5

USB适配器驱动程序安装说明

USB适配器驱动程序安装说明 概述 USB适配器是通过将电脑的USB接口模拟成传统的串行口(通常为COM3或COM4),从而使之能使用现有的编程软件或通信软件,通过适配器与PLC、MMI等设备的传统接口进行通信。 功能 ●支持的操作系统Windows2000/Windows XP ●完全兼容USB V1.1、USB2.0、USB CDC V1.1和USB CDC V2.0规范 ●USB总线供电(非隔离型)、或USB总线供电与PLC的编程口同时供电 (隔离型) ●波特率:300bps~1Mbps自动适应 系统要求 请在使用USB适配器之前确认你的电脑是IBM PC兼容型并具备以下最低 系统要求: ●Intel兼容586DX4-100MHz中央处理器或更高 ●一个标准的USB接口(4-pin A型插座) ●运行操作系统为Windows2000或Windows XP 驱动程序的安装 驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行: 1、启动所需连入的主机,进入系统。 2、将USB适配器连入主机的USB埠,系统将检测到设备并运行添加新硬 件向导帮助你设置新设备,插入驱动程序光盘并单击下一步继续。 如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中, 展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键 并运行更新驱动程序。 3、Windows将检测到安装信息,显示“USB-Serial Controller”设备,

4、选中安装驱动文件的路径,让Windows拷贝驱动程序文件到你的硬盘。 5、Windows XP 系统时,有可能提示下图要求认证,此时点击进入下 一步即可

linux笔记

20150526 echo adfkjeroiu > /var/www/html/index.html service httpd restart ifconfig XXX.XXX.XXX.XXX elinks XXX.XXX.XXX.XXX web地址栏:XXX.XXX.XXX.XXX 20150527 方法一:Setup 设置IP 方法二:vim /etc/sysconfig/network-XXX/ifcfg-eth0 onboot=no改onboot=yes service network restart 虚拟机中安装2个linux,有时2个linux无法连接网络,即使是DHCP自动获取,也不可以;解决办法:打开其中一个linux虚拟机,单机“右下角-小电脑图标” —“设置”—“桥接模式(B);直接连接屋里网络” ,确定即可; 20150528 more /etc/issue 查看当前linux是centos还是redhat; man 命令查看当前命令的使用方法及参数 table 当一个命令不记得全部字母,可以双击table补齐; ctrl +c 终止当前程序 ctrl +l 清屏 20150529 ls -l查看命令;(-l显示更多属性) ls –a 查看隐藏文件; cp -r /etc/aaa /home/bbb复制/etc下的aaa 到/home下,并且改名bbb; (-r是整个文件夹的意思,如果,没有-r是复制单个文件) mv /etc/aaa /home/bbb 移动/etc下的aaa 到/home下,并且改名bbb;

rm –r 删除一个文件;(如果要是一个文件夹,就有询问yes或no) rm –rf 删除一个文件夹;(如果要是一个文件夹,就无询问) touch 创建文件; pwd 查看当前路径; cd.. 返回相对路径; cd / 返回绝对路径; cd- 返回刚才的路径; su – root或其它用户切换用户; mkdir 创建新目录; cat 查看文件内容; more或less 逐屏查看文件内容; useradd 新添加的用户,在没有更改密码前,无法登陆; passwd 更改密码;但是,密码必须符合复杂性; groupadd 添加一个组; 20150602 w 查看谁登陆过本计算机以及对方的IP; last 查看用户的登录日志; lastlog 查看每个用户最后登录的情况;(一般用于电脑被黑了之后); more /var/log/secure who /var/log/wtmp 干了些什么? root账户下输入su - username 切换到username下输入 history 能看到这个用户历史命令,默认最近的1000条 Linux查看History记录加时间戳小技巧 1.[root@servyou_web ~]# export HISTTIMEFORMAT="%F %T `whoami` " 2.[root@servyou_web ~]# history | tail 3. 1014 2011-06-22 19:17:29 root 15 2011-06-22 19:13:02 root ./test.sh 4. 1015 2011-06-22 19:17:29 root 16 2011-06-22 19:13:02 root vim test.sh 5. 1016 2011-06-22 19:17:29 root 17 2011-06-22 19:13:02 root ./test.sh 6. 1017 2011-06-22 19:17:29 root 18 2011-06-22 19:13:02 root vim test.sh 7. 1018 2011-06-22 19:17:29 root 19 2011-06-22 19:13:02 root ./test.sh 8. 1019 2011-06-22 19:17:29 root 20 2011-06-22 19:13:02 root vim test.sh 9. 1020 2011-06-22 19:17:29 root 21 2011-06-22 19:13:02 root ./test.sh

实时数据库与驱动程序开发接口-解析

实时数据库与驱动程序开发接口 V1.0 2006/12/29发布 1引言 根据整个组态的结构描述,在驱动程序与实时数据库之间交换的内容包括采集的实时数据及由实时数据库向驱动发送的控制命令串,驱动程序要求实时数据库或其他驱动支持的功能。 2实现方式 具体的实现方式是能过共享内存的方式进行数据传送。系统驱动所使用的共享内存全部编号使用,编号从0开始顺序递增,不同的驱动使用不同的共享内存编号,一般一个驱动使用一个共享内存,特殊情况下一个驱动可以使用一个以上的共享内存号。系统提供若干函数对共享内存的创建及使用进行支持。并且提供完整的温巡驱动程序,使用纯C语言编写。二次开发人员可以阅读,参照完成其他驱动的编写工作。另外对每一个驱动的开发需要在drive目录下建立一个单独的文件存储驱动的应用程序与设置文件.以omron为例,需在drive下建立omron 目录.对每一个驱动程序写一个readme.txt文件和一个config.txt文件来描述开发的目的及驱动的用法及驱动程序的参数设置. 系统占用的共享享内存编号有如下几个, 其他程序请不要占用. 100 声音驱动使用 102 短信程序使用 103 电话语音报警使用 80web驱动使用 3驱动程序编写说明

3.1 数据区 驱动程序采集的量一般分为两种形式一种是实时数据量如遥信,遥测与遥脉等. 另一种类型是结构量,如SOE, 保护动作记录等。 实时数据量采用0 - 1999进行编号, 驱动程序开发人员可自行安排其中的某一段为遥信,遥测或遥脉, 例如0 - 100 为遥信, 101-200 为遥脉, 201 - 300 为遥测.对于遥信多的,将更多的编号分配给遥信,对于遥测多的将更多的编号分配给遥测。采集上来的量在组态的参数配置中按驱动编写的情况进行配置. 3.2 上传结构变量 结构型变量采用如下方法进行传送,系统提供若干个结构串位置,当将指定形式的若干个结构串放入结构串中时,同时将串个数告诉实时数据库。则实时数据库程序读入所有的串,并根据指定的格式进行存盘操作或命令操作。结构串的格式一般为一个特征码附加若干有效字串参数。 3.3 命令区 驱动程序从实时数据库中接收的内容一般是命令串,命令串中包括命令特征码及命令附带的数据,当收到退出命令时驱动程序应自动安全地退出. 退出命令是命令字符串"EXIT"。 3.4 下行结构变量 下传结构变量一般是由实时数据库传送到驱动程序的下行结构变量。接收下行结构变量的程序一般有声音报警,电话报警,及调度程序等。 4类接口说明 4.1 支持函数文件列表 1)ramdrive.h 2)ramdrive.c 4.2 使用步骤 1)使用方法bool CreateRam( int ramid ); 完成共享内存的建立,参数为数据共享区的编号. 2)设置实时数据 void SetValue( int id, int iValue ) id 编号iValue 实时值

linux读书笔记

12.29 Linux系统 Linux是真正的多用户、多任务操作系统。它继承了UNIX系统的主要特征,具有强大的信息处理功能,特别在Internet和Intranet的应用中占有明显优势。是一个完整的UNIX类操作系统。它允许多个用户同时在一个系统上运行多道程序。真正的32位操作系统。 用户接口 用户接口定义了用户和计算机交互作用的方式。Linux操作系统提供4种不同的用户接口。命令行接口 命令行是为具有操作系统使用经验,熟悉所用命令和系统结构的人员设计的。功能强大,使用方便的命令行是UNIX/Linux系统的一个显著特征。支持命令行的系统程序是命令解释程序。它的主要功能是接收用户输入的命令,然后予以解释并执行。 “$ ”是系统提示符。 在UNIX/Linux系统中,通常将命令解释程序称为shell。各种Linux环境下都安装了多种shell。这些shell由不同的人编写并得到一部分用户的青睐,各有其优势,最常用的几种是Bourne shell(sh),C shell(csh),Bourne Again shell(bash)和Korn shell(ksh)。红旗Linux 的默认shell是bash。 Bash 菜单 图形用户接口 程序接口 程序接口也称为系统调用接口。用户在自己的C程序中使用系统调用,从而获得系统提供的更基层的服务。 系统调用是操作系统内核与用户程序,应用程序之间的接口。在UNIX/Linux系统中,系统调用以C函数的形式出现。例如:fd=fopen(“file1.c”,2);其中,open是系统调用。 所有内核之外的程序都必须经由系统调用才能获得操作系统的服务。系统调用只能在C程序中使用,不能作为命令在终端上执行。由于系统调用能直接进入内核执行,所以其执行效率高。 Linux的版本 Linux有两种版本:核心(Kernel)版本和发行(Distribution)版本。 核心版本 核心版本主要是Linux的内核。Linux内核的官方版本由Linus Torvalds本人维护着。核心版本的序号由三部分数字构成,其形式为:major.minor.patchlevel 其中,major是主版本号,minor是次版本号,二者共同构成了当前核心版本好;patchlevel 表示对当前版本的修订次数。例如:2.6.34表示对2.6核心版本的第34次修订。

一个简单字符设备驱动实例

如何编写Linux设备驱动程序 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),表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备

CP驱动程序安装说明

CP210X驱动程序安装说明 2009/12/18 概述 USB编程电缆或USB接口产品是通过将电脑的USB接口模拟成传统的串行口(通常为COM3),从而使用现有的编程软件或通信软件,通过编程电缆与PLC 等设备的传统接口进行通信。 功能 ● 支持的操作系统Windows2000/XP/Vista/Win7 ● 完全兼容USB 2.0规范 ● USB总线供电(非隔离产品)、或USB总线供电与PLC的编程口同时供 电(隔离型产品) ● 波特率:300bps~1Mbps自动适应 ● 每台PC只支持一个USB接口转换产品(如一台电脑需使用多个USB 接口产品,需为各个USB接口产品设置不同的序列号,请咨询生产厂家 索取序列号设置工具软件) 系统要求 请在使用USB编程电缆之前确认你的电脑是IBM PC兼容型并具备以下最低系统要求: ● Intel兼容586DX4-100MHz中央处理器或更高 ● 一个标准的USB接口(4-pin A型插座) ● 运行操作系统为Windows2000/XP/Vista/Win7 驱动程序的安装 新版本驱动程序的安装与以前不同,安装非常简单,只需按提示进行即可。 在Windows2K/XP/Vista操作系统中点击文件CP210x_VCP_Win2K_XP_Vista 按提示安装。

在Windows 7操作系统中点击文件CP210x_VCP_Win7按提示安装。 安装完成后插入USB电缆,系统会提示自动安装驱动程序并按要求重新启动计算机后,在Windows的“开始\设置\控制面板\系统\硬件\设备管理器”菜单的“端口(COM和LPT)”展开条目中出现“Silicon Labs Cp210x USB to UART Bridge(COMx)”,这个COMx(如下图红线框中的COM3)就是USB编程电缆使用的COM口号。以后每次使用只要插入编程电缆就会出现该COM口,你只需在编程软件或通信软件等应用软件中选中该COM口即可。 驱动程序的卸载 卸载驱动程序是为了释放COM口资源以便其他设备使用,或驱动程序故障时需将其卸载后重新安装,按下面步骤卸载驱动程序: 1、从你的电脑上拔下USB编程电缆。 2、进入控制面板中的“卸载程序”,选中下图红线框中的条目,单击“卸载/更 改”按钮即可卸载驱动程序。

相关文档
最新文档