当前位置:文档之家› PCI驱动编程基本框架

PCI驱动编程基本框架

PCI驱动编程基本框架
PCI驱动编程基本框架

Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux 内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。

1. 字符设备和块设备

Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第一个IDE硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将无法访问到设备驱动程序。

在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。

2. 设备驱动程序接口

Linux中的I/O子系统向内核中的其他部分提供了一个统一的标准设备接口,这是通过include/linux/fs.h中的数据结构file_operations来完成的:

struct file_operations {

struct module *owner;

loff_t (*llseek) (struct file *, loff_t, int);

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

int (*readdir) (struct file *, void *, filldir_t);

unsigned int (*poll) (struct file *, struct poll_table_struct *);

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

int (*mmap) (struct file *, struct vm_area_struct *);

int (*open) (struct inode *, struct file *);

int (*flush) (struct file *, fl_owner_t id);

int (*release) (struct inode *, struct file *);

int (*fsync) (struct file *, loff_t, loff_t, int datasync);

int (*aio_fsync) (struct kiocb *, int datasync);

int (*fasync) (int, struct file *, int);

int (*lock) (struct file *, int, struct file_lock *);

ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

int (*check_flags)(int);

int (*flock) (struct file *, int, struct file_lock *);

ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);

ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);

int (*setlease)(struct file *, long, struct file_lock **);

long (*fallocate)(struct file *file, int mode, loff_t offset,

loff_t len);

};

当应用程序对设备文件进行诸如open、close、read、write等操作时,Linux内核将通过file_operations结构访问驱动程序提供的函数。例如,当应用程序对设备文件执行读操作时,内核将调用file_operations结构中的read函数。

3. 设备驱动程序模块

Linux下的设备驱动程序可以按照两种方式进行编译,一种是直接静态编译成内核的一部分,另一种则是编译成可以动态加载的模块。如果编译进内核的话,会增加内核的大小,

还要改动内核的源文件,而且不能动态地卸载,不利于调试,所有推荐使用模块方式。

从本质上来讲,模块也是内核的一部分,它不同于普通的应用程序,不能调用位于用户态下的C或者C++库函数,而只能调用Linux内核提供的函数,在/proc/ksyms中可以查看到内核提供的所有函数。

在以模块方式编写驱动程序时,要实现两个必不可少的函数init_module( )和

cleanup_module( ),而且至少要包含和两个头文件。一般使用LDD3 例程中使用的makefile 作为基本的版本,稍作改变之后用来编译驱动,编译生成的模块(一般为.ko文件)可以使用命令insmod载入Linux内核,从而成为内核的一个组成部分,此时内核会调用模块中的函数init_module( )。当不需要该模块时,可以使用rmmod命令进行卸载,此进内核会调用模块中的函数cleanup_module( )。任何时候都可以使用命令来lsmod查看目前已经加载的模块以及正在使用该模块的用户数。

4. 设备驱动程序结构

了解设备驱动程序的基本结构(或者称为框架),对开发人员而言是非常重要的,Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。

驱动程序的注册与注销

向系统增加一个驱动程序意味着要赋予它一个主设备号,这可以通过在驱动程序的初始化过程中调用register_chrdev( )或者register_blkdev( )来完成。而在关闭字符设备或者块设备时,则需要通过调用unregister_chrdev( )或unregister_blkdev( )从内核中注销设备,同时释放占用的主设备号。但是现在

程序员都倾向于动态创建设备号和设备结点,动态创建设备号和设备结点需要几个指定的函数,具体

可以参见“Linux字符驱动中动态分配设备号与动态生成设备节点”。

设备的打开与释放

打开设备是通过调用file_operations结构中的函数open( )来完成的,它是驱动程序用来为今后的操作完成初始化准备工作的。在大部分驱动程序中,open( )通常需要完成下列工作:

1.检查设备相关错误,如设备尚未准备好等。

2.如果是第一次打开,则初始化硬件设备。

3.识别次设备号,如果有必要则更新读写操作的当前位置指针f_ops。

4.分配和填写要放在file->private_data里的数据结构。

5.使用计数增1。

释放设备是通过调用file_operations结构中的函数release( )来完成的,这个设备方法有时也被称为close( ),它的作用正好与open( )相反,通常要完成下列工作:

1.使用计数减1。

2.释放在file->private_data中分配的内存。

3.如果使用计算为0,则关闭设备。

设备的读写操作

字符设备的读写操作相对比较简单,直接使用函数read( )和write( )就可以了。但如果是块设备的话,则需要调用函数block_read( )和block_write( )来进行数据读写,这两个函数将向设备请求表中增加读写请求,以便Linux内核可以对请求顺序进行优化。由于是对内存缓冲区而不是直接对设备进行操作的,因此能很大程度上加快读写速度。如果内存缓冲区中没有所要读入的数据,或者需要执行写操作将数据写入设备,那么就要执行真正的数据传输,这是通过调用数据结构blk_dev_struct中的函数request_fn( )来完成的。

设备的控制操作

除了读写操作外,应用程序有时还需要对设备进行控制,这可以通过设备驱动程序中的函数ioctl( )来完成,ioctl 系统调用有下面的原型: int ioctl(int fd, unsigned long cmd, ...),第一个参数是文件描述符,第二个参数是具体的命令,一般使用宏定义来确定,第三个参数一般是传递给驱动中处理设备控制操作函数的参数。ioctl( )的用法与具体设备密切关联,因此需要根据设备的实际情况进行具体分析。

设备的中断和轮询处理对于不支持中断的硬件设备,读写时需要轮流查询设备状态,以便决定是否继续进行数据传输。如果设备支持中断,则可以按中断方式进行操作。

基本框架

在用模块方式实现PCI设备驱动程序时,通常至少要实现以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块。下面给出一个典型的PCI设备驱动程序的基本框架,从中不难体会到这几个关键模块是如何组织起来的。

/*指明该驱动程序适用于哪一些PCI设备*/

static struct pci_device_id my_pci_tbl [] __initdata = {

{PCI_VENDOR_ID, PCI_DEVICE_ID,PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},

{0,}

};

/*对特定PCI设备进行描述的数据结构*/

struct device_private {

...

}

/*中断处理模块*/

static irqreturn_t device_interrupt(int irq, void *dev_id)

{

/*... */}

/*设备文件操作接口*/

static struct file_operations device_fops = {

owner: THIS_MODULE, /*demo_fops所属的设备模块*/read: device_read, /*读设备操作*/write: device_write, /*写设备操作*/ioctl: device_ioctl, /*控制设备操作*/mmap:

device_mmap, /*内存重映射操作*/open: device_open, /*打开设备操作*/release:

device_release /*释放设备操作*/

/*... */};

/*设备模块信息*/

static struct pci_driver my_pci_driver = {

name: DEVICE_MODULE_NAME, /*设备模块名称*/id_table: device_pci_tbl, /*能够驱动的设备列表*/probe: device_probe, /*查找并初始化设备*/remove: device_remove /*卸载设备模块*/

/*... */};

static int __init init_module (void)

{

/*... */}

static void __exit cleanup_module (void)

{

pci_unregister_driver(&my_pci_driver);

}

/*加载驱动程序模块入口*/module_init(init_module);

/*卸载驱动程序模块入口*/module_exit(cleanup_module);

上面这段代码给出了一个典型的PCI设备驱动程序的框架,是一种相对固定的模式。需要注意的是,同加载和卸载模块相关的函数或数据结构都要在前面加上__init、__exit等标志符,以使同普通函数区分开来。构造出这样一个框架之后,接下去的工作就是如何完成框架内的各个功能模块了。

针对相应设备定义描述该PCI设备的数据结构:

struct device_private

{

/*注册字符驱动和发现PCI设备的时候使用*/

struct pci_dev *my_pdev;//

struct cdev my_cdev;//

dev_t my_dev;

atomic_t created;

/*用于获取PCI设备配置空间的基本信息*/unsigned long mmio_addr;

unsigned long regs_len;

int irq;//中断号

/*用于保存分配给PCI设备的内存空间的信息*/dma_addr_t rx_dma_addrp;

dma_addr_t tx_dma_addrp;

/*基本的同步手段*/

spinlock_t lock_send;

spinlock_t lock_rev;

/*保存内存空间转换后的地址信息*/

void __iomem *ioaddr;

unsigned long virts_addr;

int open_flag //设备打开标记

.....

};

初始化设备模块:

static struct pci_driver my_pci_driver = {

name: DRV_NAME, //驱动的名字,一般是一个宏定义

id_table: my_pci_tbl, //包含了相关物理PCI设备的基本信息,vendorID,deviceID 等

probe: pci_probe, //用于发现PCI设备

remove: __devexit_p(pci_remove), //PCI设备的移除

};

// my_pci_tbl 其实是一个struct pci_device 结构,该结构可以有很多项,每一项代表一个设备

// 该结构可以包含很多项,每一项表明使用该结构的驱动支持的设备

// 注意:需要以一个空的项结尾,也就是:{0,}

static struct pci_device_id my_pci_tbl[]

__initdata = {

{ vendor_id, device_id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},

{ 0,}

};

static int __init init_module(void)

{

int result;

printk(KERN_INFO "my_pci_driver built on %s, %s\n",__DA TE__,__TIME__);

result = pci_register_driver(&my_pci_driver ); //注册设备驱动

if(result)

return result;

return0;

}

卸载设备模块:

static void __devexit my_pci_remove(struct pci_dev *pci_dev)

{

struct device_private *private;

private= (struct device_private*)pci_get_drvdata(pci_dev);

printk("FCswitch->irq = %d\n",private->irq);

//register_w32 是封装的宏,便于直接操作

//#define register_w32 (reg, val32) iowrite32 ((val32), device_private->ioaddr + (reg))

//这里的作用是关中断,硬件复位

register_w32(IntrMask,0x00000001);

register_w32(Reg_reset,0x00000001);

//移除动态创建的设备号和设备

device_destroy(device_class, device->my_dev);

class_destroy(device_class);

cdev_del(&private->my_cdev);

unregister_chrdev_region(priv->my_dev,1);

//清理用于映射到用户空间的内存页面

for(private->virts_addr = (unsigned long)private->rx_buf_virts;private->virts_addr < (unsigned long)private->rx_buf_virts + BUF_SIZE;private->virts_addr += PAGE_SIZE) {

ClearPageReserved(virt_to_page(FCswitch->virts_addr));

}

...

//释放分配的内存空间

pci_free_consistent(private->my_pdev, BUF_SIZE, private->rx_buf_virts,

private->rx_dma_addrp);

...

free_irq(private->irq, private);

iounmap(private->ioaddr);

pci_release_regions(pci_dev);

kfree(private);

pci_set_drvdata(pci_dev,NULL);

pci_disable_device(pci_dev);

}

// 总之模块卸载函数的职责就是释放一切分配过的资源,根据自己代码的需要进行具体的操作

PCI设备的探测(probe):

static int __devinit pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)

{

unsigned long mmio_start;

unsigned long mmio_end;

unsigned long mmio_flags;

unsigned long mmio_len;

void __iomem *ioaddr1=NULL;

struct device_private *private;

int result;

printk("probe function is running\n");

/*启动PCI设备*/

if(pci_enable_device(pci_dev))

{

printk(KERN_ERR "%s:cannot enable device\n",pci_name(pci_dev));

return -ENODEV;

}

printk( "enable device\n");

/*在内核空间中动态申请内存*/

if((private= kmalloc(sizeof(struct device_private), GFP_KERNEL)) == NULL)

{

printk(KERN_ERR "pci_demo: out of memory\n");

return -ENOMEM;

}

memset(private, 0, sizeof(*private));

private->my_pdev = pci_dev;

mmio_start = pci_resource_start(pci_dev, 0);

mmio_end = pci_resource_end(pci_dev, 0);

mmio_flags = pci_resource_flags(pci_dev, 0);

mmio_len = pci_resource_len(pci_dev, 0);

printk("mmio_start is 0x%0x\n",(unsigned int)mmio_start);

printk("mmio_len is 0x%0x\n",(unsigned int)mmio_len);

if(!(mmio_flags & IORESOURCE_MEM))

{

printk(KERN_ERR "cannot find proper PCI device base address, aborting.\n");

result = -ENODEV;

goto err_out;

}

/*对PCI区进行标记,标记该区域已经分配出去*/result =

pci_request_regions(pci_dev, DEVICE_NAME);

if(result)

goto err_out;

/*设置成总线主DMA模式*/pci_set_master(pci_dev);

/*ioremap 重映射一个物理地址范围到处理器的虚拟地址空间, 使它对内核可用.*/ ioaddr1 = ioremap(mmio_start, mmio_len);

if(ioaddr1 == NULL)

{

printk(KERN_ERR "%s:cannot remap mmio, aborting\n",pci_name(pci_dev));

result = -EIO;

goto err_out;

}

printk("ioaddr1 = 0x%0x\n",(unsigned int)ioaddr1);

private->ioaddr = ioaddr1;

private->mmio_addr = mmio_start;

private->regs_len = mmio_len;

private->irq = pci_dev->irq;

printk("irq is %d\n",pci_dev->irq);

/*初始化自旋锁*/spin_lock_init(&private->lock_send);

spin_lock_init(&private->lock_rev);

if(my_register_chrdev(private)) //注:这里的注册字符设备,类似于前面的文章中介绍过的动态创建设备号和动态生成设备结点

{

printk("chrdev register fail\n");

goto err_out;

}

//下面这两个函数根据具体的硬件来处理,主要就是内存分配、对硬件进行初始化设置等

device_init_buf(xx_device);//这个函数主要进行内存分配,内存映射,获取中断

device_hw_start(xx_device);//这个函数主要是往寄存器中写一些值,复位硬件,开中

断,打开DMA等

//把设备指针地址放入PCI设备中的设备指针中,便于后面调用pci_get_drvdata

pci_set_drvdata(pci_dev, FCswitch);

return0;

err_out:

printk("error process\n");

resource_cleanup_dev(FCswitch); //如果出现任何问题,释放已经分配了的资源

return result;

}

// probe函数的作用就是启动pci设备,读取配置空间信息,进行相应的初始化

中断处理:

//中断处理,主要就是读取中断寄存器,然后调用中断处理函数来处理中断的下半部分,一般通过tasklet或者workqueue来实现

注意:由于使用request_irq 获得的中断是共享中断,因此在中断处理函数的上半部需要区分是不是该设备发出的中断,这就需要读取中断状态寄存器的值来判断,如果不是该设备发起的中断则返回IRQ_NONE

static irqreturn_t device_interrupt(int irq, void *dev_id)

{

...

if( READ(IntMask) == 0x00000001)

{

return IRQ_NONE;

}

WRITE(IntMask,0x00000001);

tasklet_schedule(&my_tasklet); //需要先申明tasklet 并关联处理函数

...

return IRQ_HANDLED;

}

//声明tasklet

static void my_tasklet_process(unsigned long unused);

DECLARE_TASKLET(my_tasklet, my_tasklet_process, (unsigned long)&private);//第三个参数为传递给my_tasklet_process 函数的参数

设备驱动的接口:

static struct file_operations device_fops = {

owner: THIS_MODULE,

open: device_open, //打开设备

ioctl: device_ioctl, //设备控制操作

mmap: device_mmap,//内存重映射操作

release: device_release,//释放设备

};

打开设备:

open 方法提供给驱动来做任何的初始化来准备后续的操作. open 方法的原型是:

int (*open)(struct inode *inode, struct file *filp);

inode 参数有我们需要的信息,以它的i_cdev 成员的形式, 里面包含我们之前建立的cdev 结构. 唯一的问题是通常我们不想要cdev 结构本身, 我们需要的是包含cdev 结构的device_private 结构.

static int device_open(struct inode *inode, struct file *filp)

{

struct device_private *private;

private= container_of(inode->i_cdev, struct device_private, my_cdev);

filp->private_data = private;

private->open_flag++;

try_module_get(THIS_MODULE);

...

return0;

}

释放设备:

release 方法的角色是open 的反面,设备方法应当进行下面的任务:

? 释放open 分配在filp->private_data 中的任何东西

? 在最后的close 关闭设备

static int FCswitch_release(struct inode

*inode,struct file *filp)

{

struct device_private *private= filp->private_data;

private->open_flag--;

module_put(THIS_MODULE);

printk("pci device close success\n");

return0;

}

设备控制操作:

PCI设备驱动程序可以通过device_fops 结构中的函数device_ioctl( ),向应用程序提供对硬件进行控制的接口。例如,通过它可以从I/O寄存器里读取一个数据,并传送到用户空间里。

static int device_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)

{

int retval = 0;

struct device_private *FCswitch = filp->private_data;

switch (cmd)

{

case DMA_EN://DMA使能

device_w32(Dma_wr_en, arg);

break;

...

default:

retval = -EINV AL;

}

return retval;

}

内存映射:

static int device_mmap(struct file *filp, struct vm_area_struct *vma)

{

int ret;

struct device_private *private = filp->private_data;

vma->vm_page_prot = PAGE_SHARED;//访问权限

vma->vm_pgoff = virt_to_phys(FCswitch->rx_buf_virts) >> PAGE_SHIFT;//偏移(页帧号)

ret = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, (unsigned

long)(vma->vm_end-vma->vm_start), vma->vm_page_prot);

if(ret!=0)

return -EAGAIN;

return0;

}

对remap_pfn_range()函数的说明:

remap_pfn_range()函数的原型:

int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);

该函数的功能是创建页表。其中参数vma是内核根据用户的请求自己填写的,而参数addr表示内存映射开始处的虚拟地址,因此,该函数为addr~addr+size之间的虚拟地址构造页表。

另外,pfn(Page Fram Number)是虚拟地址应该映射到的物理地址的页面号,实际上就是物理地址右移PAGE_SHIFT位。如果PAGE_SHIFT为4kb,则PAGE_SHIFT为12,因为PAGE_SHIFT等于1<

在驱动程序中,一般能使用remap_pfn_range()映射内存中的保留页(如X86系统中的640KB~1MB区域)和设备I/O内存。因此,如果想把kmalloc()申请的内存映射到用户空间,则可以通过SetPageReserved把相应的内存设置为保留后就可以。

寻找摄像头驱动的方法,告别万能驱动

寻找摄像头驱动的方法,告别万能驱动 QQ 2009-02-12 21:46 阅读709 评论0 字号:大中小 寻找摄像头驱动的方法,告别万能驱动 摄像头用久了或重新安装系统后,遇到光盘驱动不知道放哪里了,可以通过硬件ID来精确找到所需要的驱动或寻求帮助。具体办法如下: 方法是:右键我的电脑--管理--设备管理器--找到摄像头的有问号的设备--双击--找到详细信 息--里面有个硬件ID。 类似于USB\VID_07E4&ID_9473这样的东西,VID就是芯片厂商代码,PID就能确定摄 像头芯片方案,然后就可以对照下载驱动了。 什么是硬件ID呢? 硬件ID是电脑所有硬件的一个编号,所有设备都有如下编号:VEN_1106&DEV_3038,VE N代表硬件厂商,DEV代表产品编号。USB设备会有如下编号:VID_045E&ID_0039, 道理跟上面的是一样的。所有的测试软件都有可能会出错,只有硬件ID是最可靠的,各位只要确认下INF文件包含需要的硬件ID,就保证是可以用的。 如何获得硬件ID? 最简单的方法是直接在设备管理器中查看。右键“我的电脑” --- 管理(第四个就是管理)--- 找到里面的“设备管理器” --- 无论什么设备双击打开,选择“详细信息” --- 就可以看到“P CI\VEN_1106&DEV_3059&SUBSYS_82121565&REV_60\3&13C0B0C5&0&8D”这样的一串字符,里面的VEN_1106&DEV_3059就是关键的硬件ID,点击字符按键盘“CTRL+C”就可以 复制出来了,贴到论坛就可以了。 当然你也可以用EVEREST生成硬件报告,里面也可以找到硬件ID。 我们打开驱动的INF文件,就可以找到里面的“VEN_10EC&DEV_8180”对应设备管理器的硬 件ID即可判断驱动是否正确。 以最常见的摄像头为例,由于摄像头厂家众多,驱动非常混乱,各个网站也出现所谓的万能,这个世界有万能的东西吗?让我们相信硬件ID吧,集中市面的硬件ID,因为摄像头的芯片厂家就那么几家,这样就可以让大家可以很方便找到自己所有需要的驱动。 查看摄像头硬件ID的方法 右键点击“我的电脑”-“管理”-“设备管理器”-“图像处理设备”选择任意一个摄像头设备双击, 在“详细信息”一栏即可看到下面这个信息: 2_30_d992b48b7f8 e721.gif(18.44 KB)

万能LED电视背光驱动板

1 作者:吴善龙万能LED电视背光驱动板 万能LED电视背光驱动板 作者:吴善龙 LED背光电视机,采用LED灯条作为背光,LED灯条驱动板实际上是一个恒流板,要求驱动板输出的电流是恒定不变的,不随环镜温度、供电高低而变化。LED灯条供电电压,因灯条串联灯珠的个数不同而异,有的灯条串联的灯珠是8个,有的是12个灯珠,有的是14个灯珠,有的是18个灯珠,有的是24个灯珠,总之随电视机屏幕的尺寸大小不同,灯条内串联灯珠的多少也不同。另外,屏幕内灯条的数量也不同,有很多屏幕内有四个灯条,每个灯条首尾各有一根引线,那么一根灯条有两根引线。四根灯条共有8根引线。这8根引线接到背光驱动板上,在驱动板内把四根灯条两两串联,成为两组灯条,再由驱动电路驱动这两组灯条。 也有的机型屏幕中,四根灯条在屏幕内部完成两两串联成为两组灯条,从屏幕内只引出两组灯条的四根引线,接到背光驱动板上。也有的机型,四根灯条的8根引线全部接到背光驱动板上,分别由8个驱动输出电路独立驱动8根灯条。 背光灯条需要的驱动电压,有高有低,有多种类型。低的有需要12V的,也有24V 36V 48V 80V 100V 120 V 140V 180V 200V 240V。实际上,80V和120V最为常见。 因为不同厂家、不同型号的LED灯珠采用的材料不同,设计的参数不同,因此,灯条的额定电流各不相同。有的是200ma,有的是300ma,有的是500ma。这要实测原机灯条电流才知道。电流比额定值小时发光暗,达不到原机的亮度。电流过大时会使灯珠温度过高,灯珠寿命大大缩短,同时,电流比额定值增大时,LED发光亮度增大并不明显。因此,最好让灯条的电流在额定电流值。如果不知道灯条的额定电流是多大,先给灯条加一个低的电压让灯条开始发暗光,然后慢慢提高灯条的供电电压同时监测灯条的电流,看灯条发光亮度逐步提高,当发光亮度不再随电流增大而明显增强时,当前的灯条电流作为工作时的正常电流。大部份灯条的电流是300ma,选取200ma的电流更为安全。 LED背光电路驱动板的代用,比老式荧光灯管背光电路的代用简单容易的多。因为荧光灯管的驱动对驱动板的要求极为苛刻,电压、电流、阻抗稍有差别代换就失败。而且荧光灯管驱动是很高的高频交流电压、小电流,制造困难,在维修实践中要找到很相近的代用板是很难的。而LED背光驱动则不同,它是低电压、直流电,只对电流有要求,对电压不敏感。当电流达到要求时,电压也就自然而然的达到正常值了。因此,在维修和代换驱动板时,不要测背光驱动板输出的电压多高,只监测LED灯条的电流是多大就行了。 现在生产的电视机,品牌众多,背光驱动电路五花八门,有时候背光板坏了,买不到零件,只能用万能代换板修机。有的原机的背光板太贵,而万能代换板很便宜,所以背光板的代换很有价值。本文提供万能背光板的代换实例。 以下的这款背光通用代用板,售价只需要26元,26寸到55寸电视机通用。很便宜,改装很简便。可以方便的调整LED灯串电流的大小。

wdm驱动开发之路

WDM驱动开发之路 写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。功到自然成嘛。不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。 按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。 今天我们一起讨论第一部分,了解篇。 (一)了解篇 WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。作为驱动开发人员来说,它在两者中有很多的不同。并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。 要写驱动程序,首先要了解操作系统的结构。在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。但实际上,Windows2000的WDM实现中有很多例程在Windows98中没有实现,一旦试图加载这样的WDM驱动程序到Windows98中,则不能正常加载,当然我们也有办法实现它,那就是利用“桩”技术。具体可参见Walter Oney写的《Programming the Microsoft Windows Driver Model》一书。我们首先来看看Windows 2000的系统结构,然后再来看看Windows 98的。 图一是Windows 2000的系统结构图。从图中我们可以看出:整个系统被分为两个态,用户态和核心态。 从图中可以明显看出I/O操作最后是怎样作用到硬件上的。用户态应用程序对Windows 子系统进行win32 API调用,这个调用由系统服务接口作用到I/O管理器(严格地说,在Windows 系统中不存在I/O管理器这样的独立模块,这个只是为了方便叙述而将各种核心功能调用的集合称作I/O管理器,业界人士都这样称呼这个部分),I/O管理器进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传给驱动程序。简单情况下,驱动程序直接执行这个请求包,并与硬件打交道,从而完成I/O请求工作,最后由I/O管理器将执行结果返回给用户态程序。但在WDM体系结构中,大部分实行分层处理。即在图中“设备驱动“这部分,分成了若干层,典型地分成高层驱动程序、中间层驱动程序、底层驱动程序。每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。以文件系统驱动为例,最高层驱动只知道文件如何在磁盘上表示,但不知到怎样得到数据。最低层驱动程序只知道怎样从磁盘取出512B为单的数据块,但不知道文件怎样表示。举个更具体的生活例子。主人(最高层驱动)知道(并且需要)笔计本电脑,但不知道具体放在什么位置;而仆人(最底层驱动)却知道它放在具体什么地方,但

【推荐下载】万能声卡驱动怎么安装 电脑没有声音如何处理

[键入文字] 万能声卡驱动怎么安装电脑没有声音如何处理 一般来说电脑没有声音了,那么很有可能是因为声卡没有安装好,不少人在安装声卡驱动程序的时候,会选择万能声卡驱动,那么万能声卡驱动怎么安装呢?如果不是因为声卡驱动没有安装好的话,那么电脑没有声音该如何处理。接下来小编就简单的给大家介绍一下万能声卡驱动怎么安装和电脑没有声音如何处理。 一般来说电脑没有声音了,那么很有可能是因为声卡没有安装好,不少人在安装声卡驱动程序的时候,会选择万能声卡驱动,那么万能声卡驱动怎么安装呢?如果不是因为声卡驱动没有安装好的话,那么电脑没有声音该如何处理。接下来小编就简单的给大家介绍一下万能声卡驱动怎么安装和电脑没有声音如何处理。 一、万能声卡驱动怎么安装 1、我们可以在百度中搜索万能声卡驱动,页面中会出现相关的信息,我们单击其中一个万能声卡驱动下载,在其页面中点击本地下载,将它保存在桌面上。我们将万能声卡驱动解压之后,双击将它打开,点击其中的安装程序,电脑屏幕上会出现安装页面,我们点击安装就可以了。在驱动安装的过程中,最好不要将它中断,因为这样会很容易导致系统异常。 2、如果万能声卡驱动不能够自动安装的话,我们先将其解压后,记录好万能声卡的路径。然后鼠标右击电脑桌面上的我的电脑,在页面中选择属性选项,在属性页面中点击硬件,选择设备管理器。 我们点击其中的声音、视频选项后,鼠标右击它下面的声卡选项,在出现的页面中选择更新驱动程度,点击硬件更新向导。选中从列表或指定位置安装后点击下一步,将页面中的搜索可移动媒体去掉,点击在搜索中包括这个位置,在它的下拉框中将万能声卡的路径复制上去,点击下一步,系统就会自动安装好声卡驱动程序。 1

从零开始搭建Linux驱动开发环境

参考: 韦东山视频第10课第一节内核启动流程分析之编译体验 第11课第三节构建根文件系统之busybox 第11课第四节构建根文件系统之构建根文件系统韦东山书籍《嵌入式linux应用开发完全手册》 其他《linux设备驱动程序》第三版 平台: JZ2440、mini2440或TQ2440 交叉网线和miniUSB PC机(windows系统和Vmware下的ubuntu12.04) 一、交叉编译环境的选型 具体的安装交叉编译工具,网上很多资料都有,我的那篇《arm-linux- gcc交叉环境相关知识》也有介绍,这里我只是想提示大家:构建跟文件系统中所用到的lib库一定要是本系统Ubuntu中的交叉编译环境arm-linux- gcc中的。即如果电脑ubuntu中的交叉编译环境为arm-linux-

二、主机、开发板和虚拟机要三者互通 w IP v2.0》一文中有详细的操作步骤,不再赘述。 linux 2.6.22.6_jz2440.patch组合而来,具体操作: 1. 解压缩内核和其补丁包 tar xjvf linux-2.6.22.6.tar.bz2 # 解压内核 tar xjvf linux-2.6.22.6_jz2440.tar.bz2 # 解压补丁

cd linux_2.6.22.6 patch –p1 < ../linux-2.6.22.6_jz2440.patch 3. 配置 在内核目录下执行make 2410_defconfig生成配置菜单,至于怎么配置,《嵌入式linux应用开发完全手册》有详细介绍。 4. 生成uImage make uImage 四、移植busybox 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向bu sybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用make menuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 ->Busybox Settings ->Build Options

行为驱动开发

行为驱动开发 行为驱动开发(简称BDD)是测试驱动开发的升级版。它是一套软件工程实践方法,能帮助研发团队更快地构建和交付更有价值和更高质量的软件产品。采用BDD思想编写的测试读起来更像规格说明书而不是单元测试,所以它是使用测试作为表达和验证行为的一种手段。基于这个特性,BDD也非常适合应用在需求分析中。 一、行为驱动开发的原则 1.聚焦交付业务价值。使用验收标准作为目标,帮助业务实现更实际的可交付的功能。 2.团队共同确定交付标准。业务分析人员,开发人员,测试人员与最终用户一起定义和指定功能。 3.拥抱变化。项目开始时不锁定需求,而是假设需求,从用户那里得到早期的反馈,对需求的理解将在项目的整个生命周期中演进和变更。 4.不仅仅编写自动化测试,而是编写可执行规范和底层规范。团队将验收标准转换为自动化的验收测试,更准确地说是转换为可执行规范。在编写任何代码之前,开发人员将考虑代码实际上应该做什么,并将其表示为底层的可执行规范。可执行规范是一种自动化测试,它演示和验证应用程序如何交付特定的业务需求。自动化测试作为构建过程的一部分运行,并在对应用程序进行更改时运行,进行验收测试和回归测试。 5.交付活文档,并使用活文档来支持后续维护工作。在项目结束后持续维护项目可执行规范。 二、行为驱动开发的优势 1.专注业务目标,避免工程师把工作量浪费在不提供业务价值的功能上,能够降低成本,减少浪费。

2.完整的可执行规范,可充当开发人员的辅助技术文档,更容易理解现有的代码库并进行更改。 3.全面的自动化验收测试和回归测试,不仅可以提升执行效率,也能降低手工测试的出错率,使得迭代速度更快更可靠。 三、行为驱动开发的缺陷 1. 需要多个角色高度参与和协作,涉众如果不愿意或不能参与对话和协作,或者等到项目结束后才给出反馈,就很难充分利用BDD的优点。 2.比较适用于敏捷开发,但不太适用于瀑布式开发。 3.对参与角色能力要求很高,尤其是测试团队,不仅需要精通业务,对业务目标清晰,而且对测试技术能力要求更高,如果编写的自动化测试很烂,会导致更高的测试维护成本。

自动化控制软件和硬件的万能连接-OPC

自动化控制软件和硬件的万能连接-OPC 1 引言 自动化技术人员都有一个美丽的梦想,是否可以将自动化控制软件和硬件万能连接。而不再考虑驱动程序和接口问题,即非常简单的Plug&Play{即插即用}。使用OPC(用于过程控制的OLE),可以帮助实现这个梦想。当然用户对此很感兴趣,并且首先赢得了自动化软件制造商的支持-OPC的第一批产品己先于标准化委员会确定的日期投放市场。 在以前的自动化领域的通信技术规范方面,很少有象OPC新技术标准那样能引起如此强烈轰动。OPC(OLE for Process Control用于过程控制的OLE)在今天已经理所当然地被自动化组件的制造商逐步发展成一个事实上的新技术标准。而所谓OLE(Object linking and embedding)含义是对象链接及嵌入,用于过程控制。 当今,软件在自动化领域内使用的重要性与日俱增。无论项目是否涉及到操作、可视化、数据存档或控制,向纯粹的、基于PC的软件解决方案的发展趋势是不可阻挡的。这些软件解决方案不再是开发单个的块,而是由专用的软件组件组成。采用可重复使用的模块以及利用这些模块所具有的柔性构成整个系统,其能力似乎是没有什么能替代的,唯一例外的是通信接口的不兼容性。用于适配通信接口的时间和资金是必需要投入的,其目的是将这些软件模块组合在一起。由此开发出了数以百计的通讯接口软件程序,例如,用于过程控制或可视化系统与外围设备进行通信的接口程序。但与此同时,亦显著增加了成本。 而OPC为这种情况提供了一个补救方法:OPC使诸如软件连接器等软件组件组合在一起,这些组件不需要特殊的适配就能相互通信。因此,即插即用(Plug &Play)在自动化中成为现实。 2 为什么需要OPC? (1) 使有效的精力更多开发应用程序 对于早期的计算机系统,为了实现不同的硬件和软件所构成的计算机之间的数据交换和通信,必须要花费很多时间去开发独自的通信程序。但是正是由于现在有了数据交换和通信的工业标准,才有可以实现像互联网那样,使不同的计算机相互连接为巨大网络。所以在开发企业的信息系统时,若采用符合工业标准的数据库和客户—服务器接口,可以使有效的精力更多地投入到应用程序本身功能的开发中去。 (2) 工业制造系统也存在同样的问题 也就是使由不同的供应商提供的机器设备无须特别的软件开发就可以互相连接。例如在实现象图1那样多层生产控制信息系统时,从处理设备数据的现场设备层,到进行过程处理的过程控制系统层,以至最上层的生产管理层,建立和普及一个有效的数据交换工业标准将是当务之急。在这种情况下,利用微软Win dows视窗中的OLE/COM技术实现工业制造系统过程控制中的数据交换标准化,正是OPC本来的目的所在。

万能协议转换器驱动驱动程序列表

D RIVER L IST FOR G3,D ATA S TATION P LUS AND M ODULAR C ONTROLLER Current as of April 2011 Ethernet Drivers ?: Port Forwarder ?: Raw TCP/IP Active ?: Raw TCP/IP Passive ?: Raw UDP/IP ?AC Tech: Simple Servo UDP ?Acromag: TCP/IP Master ?Adenus: Telnet Driver ?Allen-Bradley: DF1 Master ?Allen-Bradley: DF1 Master via PCCC/EIP ?Allen-Bradley: DF1 Slave ?Allen-Bradley: Encapsulated DF1 Master ?Allen-Bradley: Native Tag Addressing ?Allen-Bradley: Native Tags via L5K file ?Alstom: ALSPA TCP/IP Master via SRTP ?Alstom: GEM80 ESP TCP/IP Master ?BACnet: 802.3 Master ?BACnet: 802.3 Slave ?BACnet: UDP/IP Master ?BACnet: UDP/IP Slave ?Banner: PresencePLUS Data ?Banner: PresencePLUS Image* ?Beckhoff: ADS/AMS TCP ?Bristol Babcock BSAP: UDP Slave* ?Bristol Babcock BSAP: UDP ?CTI: 2500/2572 CAMP TCP/IP Master ?CTI: NITP TCP/IP Master ?EtherNet I/P: Slave Adapter ?EZ Automation: EZ TCP/IP Master ?Fatek: PLC ?Galil: TCP/IP Driver ?GE: TCP/IP Master via SRTP ?Honeywell: S9000 ?KEB: DIN66019II TCP/IP Master ?Maguire: MLAN TCP/IP ?Mitsubishi: A/Q/FX Series TCP/IP Master ?Mitsubishi: A/Q/FX Series UDP/IP Master ?Mitsubishi: FX2N Encapsulated TCP/IP Master ?Mitsubishi: Q Series TCP/IP Master ?Modbus: Device Gateway ?Modbus: Encapsulated Master ?Modbus: TCP/IP Master ?Modbus: TCP/IP Slave ?Omron: G9SP-Series via FINS ?Omron: Master via FINS ?Panasonic - Matsushita: FP Series - FP MEWTOCOL-COM TCP/IP Master ?Parker: Acroloop TCP/IP Master ?Parker: Compumotor 6K TCP/IP Master ?Phoenix Contact: nanoLC TCP ?PLC Direct Koyo: EBC UDP/IP Master ?PLC Direct Koyo: ECOM UDP/IP Master ?Schneider: PLC via Modbus TCP/IP ?Schneider - Telemecanique: TSX 57 TCP/IP Master* ?Siemens: S5 AS511 via TCP/IP Version 1.04 ?Siemens: S5 AS511 via TCP/IP Version 2.02 ?Siemens: S7 300/400 TCP/IP Master ?Siemens: S7 CP243 via ISO TCP/IP Master ?Siemens: TI 500 Series TCP/IP Master ?Toshiba: T2 PLC Master ?Toyoda: PUC TCP/IP ?Unitronics: PCOM ASCII TCP/IP Master ?Unitronics: PCOM Binary TCP/IP Master ?Yamaha: RCX Series TCP/IP Master ?Yaskawa: TCP/IP Master (Legacy Only) ?Yaskawa: TCP/IP Memobus Master ?Yaskawa: TCP/IP MP2000iec ?Yaskawa: TCP/IP Series 7 ?Yaskawa: TCP/IP Universal SMC Master ?Yokogawa: FA-M3 PLC TCP/IP Master

二次调用万能驱动封装

为了封装系统后重新安装时可以自动安装自己电脑的驱动,我专门制作了万能驱动助理的专用版,里面只有本人电脑的驱动,其它驱动都删除了,修改了设置可以识别出本人电脑的硬件。但有些硬件要装了一个驱动后才会出现的,这时万能驱动助理已经关闭了不可以再自动安装了,我就谂到调用两次来解决这样的情况 我用安装虚拟机声卡驱动来作说明,下面是WanDrv5.32虚拟机专用驱动 修改了files文件夹中的[WinXP.x86]EasyDrv.ed5db 只保留虚拟机需要的驱动 复制WanDrv5.32虚拟机专用到C盘

改名为WanDrv 制作了drv.bat文件,用来删除第一次调用万能驱动助理生成的Drivers,避免第二次调用万能驱动助理时要手动点击删除Drivers的确定键 运行驱动Install 主要系复制驱动双核文件夹中的文件

驱动Install文件内容 copy ntkrpamp.exe "%windir%\Driver Cache\i386\" /y copy ntkrnlmp.exe "%windir%\Driver Cache\i386\" /Y copy ntkrnlpa.exe "%windir%\Driver Cache\i386\" /y copy ntoskrnl.exe "%windir%\Driver Cache\i386\" /y copy agp440.sys "%windir%\system32\drivers\" /Y copy fldrclnr.dll "%windir%\system32\" /Y copy nlite.bat "%windir%\" /Y copy drv.bat "%windir%\" /Y copy ntkrpamp.exe "%windir%\system32\" /Y copy ntkrnlmp.exe "%windir%\system32\" /Y copy ntkrnlpa.exe "%windir%\system32\" /Y copy ntoskrnl.exe "%windir%\system32\" /Y nlite.bat文件内容 del /f /s /q "%windir%\Driver Cache\ntkrnlpa.exe" del /f /s /q "%windir%\Driver Cache\ntkrpamp.exe" del /f /s /q "%windir%\Driver Cache\ntoskrnl.exe" del /f /s /q "%windir%\Driver Cache\ntkrnlmp.exe" del /f /s /q "%windir%\system32\ntkrnlpa.exe" del /f /s /q "%windir%\system32\ntkrpamp.exe" del /f /s /q "%windir%\system32\ntkrnlmp.exe" del /f /s /q "%windir%\system32\drivers\agp440.sys" del /f /s /q "%windir%\system32\fldrclnr.dll" del /f /s /q "%windir%\devcon.exe" del /f /s /q "%windir%\DevicePath.reg" rd /s /q "C:\Drivers" rd /s /q "C:\sysprep" rd /s /q "C:\WINDOWS\system32\RTCOM" rd /s /q "C:\WINDOWS\system32\DRVSTORE" rd /s /q "C:\WanDrv" del /f /s /q "%windir%\nlite.bat"

单片机驱动开发班

单片机驱动开发班 课程背景: 随着经济的发展,科技的突飞猛进,芯片技术也取得了飞速发展,这就使单片机技术在各种民用和工业测控等领域得到更为广泛应用。包括如今异常火爆的汽车电子中的车身控制、底盘控制、发动机控制、安全控制、娱乐系统等;包括传统的工业控制中的电机控制、温控系统、仪表设备、楼宇自控系统、数据采集系统等;包括计算机网络通信、数据传输、军用设备、航空航天等。单片机凭借其低成本、高性能的不可替代优势,已经成为微电脑控制的主力军。据统计,我国的单片机年需求量已达2亿片以上,且每年以大约15%的速度增长,发展迅速的单片机行业有着广阔的前景。 相比于发展迅猛的单片机行业,国内的单片机设计开发从业人员缺口很大。据统计,到2015年,我国单片机开发从业人员将达350万人,而目前的从业者只有大约一百五十万人,两百万的人才缺口正驱动大量人员加入这个庞大的群体。 学院优势: 硅谷芯微是深圳市硅谷龙科技有限公司教育产业下属专门从事IT实训的独立机构,深圳市硅谷龙科技有限公司始创于中国深圳,由侯工单片机工作室投资成立,致力于通过创新、高品质的课程体系和高效、实用的教育服务推动我国芯片级IT教育体系的建设。 深圳市硅谷龙科技有限公司致力于提供个性化、着眼于未来的教育服务,把国际先进且具有自主知识产权的案例全面应用于教育服务,在IT职业教育领域,硅谷龙以实用型的工程师人才培养理念作导引,以学生就业和职业生涯发展为指向,以成熟的IT开发经验为基础,通过完善、创新的课程体系以及全球化的企业合作为保障开展IT各类职业人才教育。硅谷龙在全国范围内建立实训基地,通过系统的实训,帮助学生提高职业素质及就业竞争力,并最终完成学员的就业服务。 面向行业及岗位: 面向行业:消费类电子、工控、汽车电子、监控电子等 主要岗位:单片机工程师、单片机硬件工程师、单片机技术支持工程师、单片机销售工程师、单片机驱动工程师。 教学目标:

制作万能ghost全过程

本篇是制作万能Ghost系统最的基础教程。制作出来的万能Ghost系统镜像文件,可以恢复到绝大多数的计算机上使用,对于经常装机的朋友,可以给自己带来极大的方便。 一、准备工作 1、准备所需工具软件 ※S&R&S_V9.5.1118 智能系统封装工具 ※DEPLOY.CAB(在系统安装光盘:/SUPPORT/TOOLS目录下自带) ※Ghost_v8.0 & v8.2(v8.0以上版本才能够支持NTFS分区) ※Windows2K/XP/2003系统安装光盘(推荐使用免激活的版本) ※DllCacheManager_V1.0(龙帝国专用版)Dllcache备份还原工具 2、安装操作系统 正常安装操作系统并打好系统安全补丁(一定要安装到C盘,不能安装到其他分区,除非你是整个硬盘Ghost)。操作系统可选择FA T32和NTFS两种文件格式进行安装,建议采用FA T32文件格式(不要偷懒一定要完全格式化,防止磁盘有坏区),因为Ghost对FTA32的压缩率更大一些,可以减小制作后的备份文件体积。再一个是FTA32格式在恢复后还可以转换为NTFS,而NTFS转换成FTA32的话就比较麻烦,因此采用FA T32文件格式较为灵活一些。当然认真读过MS的FA T与NTFS、NTFS与Convert NTFS区别的就应该知道,"原生"的NTFS比转换的NTFS在性能与文件碎片上更具有优势,因此也建议注重性能者采用NTFS文件格式进行安装操作系统("原生"是指直接用NTFS文件格式进行格式化的分区,而不是通过Convert转换的)。 对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP 为了防止盗版,采取了激活机制,当硬件发生改变时,系统就会要求重新激活,所以建议使用不需要激活的Windows XP版本,如大企业授权版本等。 3、安装应用软件 安装注册并设置好你所需要的应用软件,如:Office、Winrar等。 注:由于使用sysprep重新封装系统后,在恢复安装时系统将把输入法的相关设置还原到系统默认状态,封装前新安装的输入法将不在语言栏的列表里显示,需手动再次添加。为此WindowsXP的系统可在系统封装前作以下设置:打开控制面板,双击“区域和语言选项”,选择“高级”,在“默认用户帐户设置”框下选中“将所有设置应用于当前用户帐户和默认用户配置文件”,然后点“确定”,这样语言栏的输入法相关设置就添加到系统的默认配置文件中了。重新封装系统后,在恢复安装时就可使新安装的输入法自动添加到语言栏的输入法列表里了。 4、安装S&R&S_V9.5.1118 智能系统封装工具 双击S&R&S_V9.5.1118 智能系统封装工具,一路“下一步”就可以了,它会自动在当前系统分区根目录创建sysprep文件夹。然后把系统安装光盘/SUPPORT/TOOLS目录里的DEPLOY.CAB文件解压拷贝到sysprep文件夹里即可(这个目录和目录里的文件在系统封装后第一次启动安装完成时会自动删除)。 5、安装DllCacheManager_V1.0(龙帝国专用版)Dllcache备份还原工具(可选) 解压DllCacheManager.rar文件,然后把DllCacheManager.exe、ZProgBar.ocx两文件拷贝到%systemroot%目录(XP系统是C:/windows目录,2K系统为C:/winnt目录)中即可。 在配合S&R&S使用时,完成封装并运行DllCacheManager.exe备份Dllcache目录文件后,在进行恢复封装系统安装时,autohal.exe会自动调用DllCacheManager进行备份恢复并删除自己。如果不是配合S&R&S使用,则需运行DllCacheManager进行手动恢复然后再删除自己;或在相关批处理文件(如:Sysprep.inf文件里那个进入系统后第一次运行命令)中加入DllcacheManager /restore /autodelete /timeout项。也可以将DllCacheManager.rar文件解压到当

驱动精灵功能

驱动精灵 百科名片 驱动精灵软件界面 驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。另外除了驱动备份恢复功能外,还提供了Outlook 地址簿、邮件和IE 收藏夹的备份与恢复。并且有多国语言界面供用户选择。 目录[隐藏] 简介 特点 [编辑本段] 简介 经常重装电脑的人一定有找驱动程序的经验,要不旧版驱动程序已经不见了,就是事先没有备份起来,找起来相当费时;现在你只要利用驱动精灵的驱动程序备份功能,在电脑重装前,将你目前电脑中的最新版本驱动程序通通备份下载,待重装完成时,再试用它的驱动程序还原功能安装,这样,便可以节省掉许多许动程序安装的时间,并且在也不怕找不到驱动程序了。简体中文、繁体中文、英文、法文、西班牙文、俄文用户界面供选择!驱动精灵对于手头上没有驱动盘的用户十分实用,用户可以通过本软件将系统中的驱动程序提取并备份出来,达到“ 克隆” 的效果。驱动精灵可以将所有驱动程序制作到一个可执行文件,用户在重新安装操作系统后,可以使用这个文件一键还原所有的驱动程序。 [编辑本段] 特点 一、驱动精灵是只属于您自己的万能驱动程序 利用先进的硬件检测技术,配合驱动之家近十年的驱动数据库积累,驱动精灵能 够智能识别您的计算机硬件,匹配相应驱动程序并提供快速的下载与安装。您可以彻 底扔掉驱动程序光盘,毫不在乎您的计算机硬件配置,忘记那些您根本也不想去了解 的厂商和驱动网站,把驱动程序的安装与升级交给驱动精灵来搞定。 二、硬件侦测功能配置一目了然 驱动精灵现在不仅是您的驱动助手,还将是您的硬件助手。新加入的计算机硬件 检测功能让您对您的计算机配置一清二楚。随时保持硬件的最佳工作状态。现在,您 不仅可以用驱动精灵升级驱动,还可以让它帮你报出详细的硬件配置。 三、先进备份技术备份还原轻松搞定 对于很难在网上找到驱动程序的设备,不提供驱动光盘的“品牌电脑”。驱动精 灵的驱动备份技术可完美实现驱动程序备份过程。硬件驱动可被备份为独立的文件、 Zip压缩包、自解压程序或自动安装程序,系统重装不再发愁。您还可以通过驱动精灵 的驱动还原管理界面进行驱动程序还原。 四、系统补丁不用愁

基于项目驱动的嵌入式综合开发

实训报告 实训名称:基于项目驱动的嵌入式综合开发姓名: 院(系): 专业班级: 学号: 指导教师: 实习时间:

一、实训目的 (一)实习目的 本实训课程是针对嵌入式软件专业学生专门设计的,通过本课程设置的几个嵌入式综合项目的系统学习,可以使学生由浅入深的对嵌入式Linux系统进行全面学习,能够独立胜任嵌入式Linux应用开发、系统开发、驱动开发等多方面工作,并注重敬业团队精神培养。 1)增强学生的理论联系实际的能力 2)通过实训了解企业项目开发流程和学习新技术的方法 3)通过实训项目了解企业项目开发过程中文档的整理方法和问题的分析方法 4)通过实训项目加强学生对基础课程的运用能力,使其认识到基础知识的重要性5)通过实训争强学生对本专业和未来工作岗位的理解,端正心态,明确就业目标6)通过实训争强学生的编程技能,培养其良好的编码风格和编码习惯 (二)方法 本实训课程安排在学校实验室统一进行实训,学生上机独立完成规定实训项目。 (三)任务 要求每位同学独立完成实训题目的编程、调试、优化与测试,并交付使用。要求强化编程思维、编程能力和代码优化的能力,撰写《实训报告》(含:需求分析、总体设计、算法分析及设计中遇到的主要问题和解决方法,设计中尚存的不足与心得体会)。上交完成的所有源程序及相关文件。

三、实训报告 3.1 项目1名称 智能手环 3.1.1 实训内容 本次实训内容是制作智能手环,需要实现计步,测量温度,显示时间,电量,报警等功能。具体模块如下: (1)LED模块:显示电量 (2)ADC模块:模数转换 (3)PWM模块:蜂鸣器报警 (4)KEY模块:按键控制 (5)RTC模块:实时时钟 (6)计步以及温度显示模块 (7)总体实现 3.1.2 实训过程及相关结果 首先需要搭建软硬件环境,安装Ubuntu系统,安装交叉编译工具链。然后需要下载调试硬件连接,安装串口驱动等。环境搭建完成之后需要实现相应的每一个功能,具体功能如下: (1)LED模块:显示电量 此模块主要功能为点亮LED灯,以此来实现手环的点亮显示功能。 原理图如下: 在项目目录下分别创建led.c,led.h,main.c文件,根据芯片手册所分析的对应寄存器数据,在

ARM裸机驱动开发说明书

附件1: 学号: 实验设计说明书 题目ARM裸机驱动 学院计算机科学与信息工程学院 专业计算机科学与信息技术 班级12嵌入式 学生姓名古应波、卢圣 指导教师朱超平 2015年6月10日

写在前面 本文档以ARM9(三星2410/2440)为平台,介绍了如何实现裸机驱动程序的编写。初次接触裸机程序,感觉什么都是一头雾水,由于对硬件的不熟悉,所以前期花了很多时间来熟悉S3C2440的硬件原理图,初步熟悉了硬件原理之后,发现其实简单的逻辑驱动程序开发并不是很难。学习就应该这样,循序渐进。把一步步把简单的东西弄懂了,便没有复杂的了,所谓水到渠成。这篇文章是面对初学者的,把很多问题简化了。希望对刚接触ARM裸机程序开发的同学有所帮助。 由于时间和技术的限制,程序还存在不少bug,欢迎指正。

目录 第一节、项目建立 (3) 第二节、相关参数的配置 (4) 第三节、程序的编译、烧写、执行 (7) 第四节、串口驱动 (8) 第五节、LED驱动 (11) 第六节、按键及蜂鸣器驱动 (12) 第七节、步进电机驱动 (13) 第八节、RTC驱动 (14) 第九节、定时器驱动 (16) 第十节、中断驱动 (17) 第十一节、数码管驱动 (18) 第十二节、I2C矩阵键盘驱动 (19) 第十三节、LCD驱动 (20) 第十四节、触摸板驱动 (24) 第十五节、驱动整合 (26) 串口模式: (26) LCD模式: (27)

第一节、项目建立 本次项目使用的软/硬件包括: CodeWarrior for ARM Developer Suite v1.2(以下简称ADS). MagicARM2440硬件仿真平台 工程建立步骤: 打开ADS,选择File->New。在弹出的面板框中选择ARM Executable Image,项目名填写Test(可根据自己需要自行更改),项目存储位置此处选择F://ADS/Test(可根据自己需要自行更改)。注意:项目的储存位置一定不要包含中文路径,否则会出现不可预期的错误。 建立项目工程组织文件夹。在屏幕的中部点击右键,选择Create Group新建项目的组织文件夹,方便对源文件进行管理。如下图

DIY集成“万能SATA驱动”的Windows XP pro sp3 安装光盘

今天我们自己动手,来打造集成“万能SATA驱动”的Windows XP pro sp3 安装光盘。大家都知道微软正版和原版操作系统都没有SATA驱动,在安装过程中就会蓝屏。现在这将不是问题了。 我们自己动手打造一个比它更好的呢?以下提供的制作工具并不新鲜,但是“驱动程序包”绝对是目前最新、也是最全的,“打造”方法也是最简单、最可靠的。按此制作的安装光盘,适用于几近所有的品牌机和组装机。现提供具体制作方法步骤如下—— 第一步:素材准备 正版或者原版Windows XP pro sp3 光盘一张,放到光驱中,将光驱中的全部文件复制到E:\XP文件夹中。 下载集成整合工具“DPs_BASE_1006”,放到E:\; 官方下载地址: https://www.doczj.com/doc/268391647.html,/applications/driverpacks-base/10.06 点Download下载 下载最新驱动程序包,放到E:\(切记:不要解压)。 官方下载地址: https://www.doczj.com/doc/268391647.html,/driverpacks/windows/xp/x86/mass-storage/10.10 点Download下载 下载就是最新的驱动程序包。 第二步:集成整合 1。鼠标右键“DPs_BASE_1006”,点选“解压到DPs_BASE_1006\(E)”,即生成E:\DPs_BASE_1006文件夹。 2。将下载最新驱动程序包,复制到E:\DPs_BASE_1006\DriverPacks目录下。 3。运行E:\DPs_BASE_1006目录下的“DPs_BASE”,选择语言为“Chinese”/点“Apply”(即为中文)。 ——在这里整合工具会到官方检测最新的整合工具和驱动。 ——为了节约时间,直接点击“取消”。 1)点下边“>”(前进一次):“安装平台位置”下选“磁盘”;点“浏览”,选择E:\XP。 2)前进:“请选择需要整合的驱动包”,勾选“DriverPack MassStorage 10.06”。 3)继续前进:选择——整合“方式2”;完成方式“GUIrunOnce”;“禁用KTD”;“启用快速整合缓存”。

Windows驱动开发技术详解 第六章的(Windows内核函数)自我理解

Windows驱动开发技术详解第六章的(Windows内核函数)自我理解 学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。 其实这章主要就是讲函数DDK有自己的函数跟SDK一样编写DDK使用DDK提供的函数就OK了 /////////////////////////////////////////////////////////////////////////////// ASCII字符串和宽字符串 ASCII字符构造 char*str1="abc"; 打印ASCII字符串 char*string="hello"; KdPrint("%s\n",string);\\注意是小写%s ///// UNICODE字符构造 wchar_t*str2=L"abc"; 打印宽字符串 WCHAR*string=L"hello"; KdPrint("%S\n",string);\\注意是大写%S /////////////////////////////////////////////////////////////////////////////// ANSI_STRING字符串和UNICODE_STRING字符串 ASCII字符串进行了封装 typedef struct_STRING{ USHORT Length;//字符的长度。 USHORT MaximumLength;//整个字符串缓冲区的最大长度。 PCHAR Buffer;//缓冲区的指针。 }STRING; 输出字符串 ANSI_STRING ansiString; KdPrint("%Z\n",&ansiString);//注意是%Z UNICODE_STRING宽字符串封装 typedef struct_UNICODE_STRING{ USHORT Length;//字符的长度,单位是字节。如果是N个字符,那么Length等于N的2倍。USHORT MaximumLength;//整个字符串缓冲区的最大长度,单位也是字节。 PWSTR Buffer;//缓冲区的指针。 }UNICODE_STRING*PUNICODE_STRING; 输出字符串 UNICODE_STRING ansiString; KdPrint("%wZ\n",&ansiString);//注意是%wZ ///////////////////////////////////////////////////////////////////////////////

相关主题
文本预览
相关文档 最新文档