日期:2014-05-16  浏览次数:20596 次

linux驱动移植笔记

驱动移植问题归类:
目前,我涉及移植过的驱动应该有下面几类:
1,非模块化的,即直接编译进内核的,如
2,模块化的,像这样子的:module_init();
到目前我的理解是,只要注册进内核(结构体)即可。
问题1,假如没有驱动程序,系统怎么知道有这个硬件设备,
(比如windows下面,如果没有驱动,设备管理器里会有提示),
弄请了这个问题,linux设备与驱动的匹配方面可能会好理解很多。

假如板子上本来没有视频设备(摄像头),然,现在我给它安装
了一个视频设备,(这时没有驱动,系统怎么知道硬件上多了一个
设备,主设备号是这个时候给它分配的嘛!应该不是吧);然后我要
给这个设备写并且安装驱动(这个时候应该是有了主设备号吧,加入这样,
我驱动怎么知道,现在此时,里面有对应的设备?),。/proc/devices
看下面一段摘录:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@start
申请和释放设备号


内核维护着一个特殊的数据结构,用来存放设备号与设备的关系。在安装设备时,应该给设备申请一个设备号,使系统可以明确设备对应的设备号。设

备驱动程序中的很多功能,是通过设备号来操作设备的。下面,首先对申请设备号进行简述。


1.申请设备号

在构建字符设备之前,首先要向系统申请一个或者多个设备号。完成该工作的函数是register_chrdev_region(),该函数在<linux/fs.h>中定义:

int register_chrdev_region(dev_t from, unsigned count, const char *name);


其中,from是要分配的设备号范围的起始值。一般只提供from的主设备号,from的次设备号通常被设置成0。count是需要申请的连续设备号的个数。

最后name是和该范围编号关联的设备名称,该名称不能超过64字节。

和大多数内核函数一样,register_chrdev_region()函数成功时返回0。错误时,返回一个负的错误码,并且不能为字符设备分配设备号。

     在Linux中有非常多的字符设备,在人为的为字符设备分配设备号时,很可能发生冲突。Linux内核开发者一直在努力将设备号变为动态的。可以

使用alloc_chrdev_region()函数达到这个目的。(linux/fs.h)

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

在上面的函数中,dev作为输出参数,在函数成功返回后将保存已经分配的设备号。函数有可能申请一段连续的设备号,这是dev返回第一个设备号。

baseminor表示要申请的第一个次设备号,其通常设为0。count和name与register_chrdev_region()函数的对应参数一样。count表示要申请的连续

设备号个数,name表示设备的名字。

2.释放设备号

使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放统一使用下面的函数:

void unregister_chrdev_region(dev_t from, unsigned count); 

在上面这个函数中,from表示要释放的设备号,count表示从from开始要释放的设备号个数。通常,在模块的卸载函数中调用

unregister_chrdev_region()函数。

次设备号的主要用途

1、区分设备驱动程序控制的实际设备;

2、区分不同用途的设备 (misc 系列设备)

3、区分块设备的分区 (partition)

通常,为了使应用程序区分所控制设备的类型,内核使用主设备号。而存在多台同类设备时,为了选择其中的一种,设备驱动程序就使用次设备号。

 


区分块设备的分区

块设备具有被称为分区的分配领域。例如,硬盘在物理上是一个设备,从内核的角度,硬盘被分为多个分区,而以这些分区为对象则形成了文件系统,

此时,次设备号既表示设备,也表示分区。

brw-rw----  1 root disk    8,  16 2009-09-24 sdb
brw-rw----  1 root disk    8,  17 2009-09-24 sdb1
brw-rw----  1 root disk    8,  18 2009-09-24 sdb2
brw-rw----  1 root disk    8,  21 2009-09-24 sdb5
brw-rw----  1 root disk    8,  22 2009-09-24 sdb6
brw-rw----  1 root disk    8,  23 2009-09-24 sdb7
brw-rw----  1 root disk    8,  24 2009-09-24 sdb8

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-03/33863p2.htm
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@end
是不是这样:从这段代码可以看出,所谓的申请主设备号,应该是给设备申请的,而不是给驱动申请的?,,,如果真是这个样子,
那么驱动又怎么找到这个设备(号)的呢!

file结构体和inode结构体

Video for linux 2驱动分为两层:
    VIDEO CORE LAYER(videodev.c)
---------------------------------
    video heardward layer(such as mxc_v4l2_capture.c)

 

linux驱动移植
关于驱动移植的步骤:
一,找到相应芯片的驱动源码
二,两种情况,选择一种:
    1)模块形式
    2) 直接编译进内核
三,理清目标内核中驱动加载运行思路
四,做相应修改,修改Kconfig,Makefile等配置文件, 配置。
五,测试

六,关于bsp


       BSP板级支持包(board support package), 是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器 的函数包,使之能够更好的运行与硬件主板。在嵌入式体统软件的组成中,就有BSP。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的 BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要 按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好的支持上层 OS

下面我们举一个例子: