码迷,mamicode.com
首页 > 系统相关 > 详细

linux驱动开发前奏

时间:2015-04-24 09:19:42      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:linux   驱动开发   硬件访问   静态映射   动态映射   

1.驱动开发概述

驱动分类:

1.常规分类:字符设备,块设备,网络设备
字符设备:是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open,close,read等系统调用,例如:串口,LED,按键
块设备:在大部分unix系统中,块设备定义为:以块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。
                而linux则允许块设备传送任意数目的字节。因此,块和字符设备的区别仅仅是驱动的与内核的接口不同。常见的块设备包括硬盘,flash,SD卡等。
网络设备:网络设备可以是一个硬件设备,如网卡等;也可以是一个纯粹的软件设备,如回环接口lo,一个网络接口负责发送和接收数据报文。

2.总线分类法
USB设备,PCI设备,平台总线设备

2.硬件访问技术

硬件访问实质
驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器。

地址映射
在linux系统中,不论是内核程序还是应用程序,都智能使用虚拟地址,而芯片手册给出的寄存器地址或RAM地址等都是物理地址,无法直接使用,因此我们读写寄存器的第一步就是讲物理地址映射为虚拟地址。

1.动态映射
在驱动程序中采用ioremap函数将物理地址映射为虚拟地址
函数原型: void *ioremap(physaddr, size);
参数说明:physaddr:待映射的物理地址    size:映射的区域长度
返回值:映射后的虚拟地址

2.静态映射
所谓静态映射,是指linux系统根据用户事先指定的映射关系,在内核启动后,自动的将物理地址映射为虚拟地址。
问题1:如何事先指定映射关系?
        在静态映射中,用户是通过map_desc结构来指明物理地址与虚拟地址的映射关系。
struct map_desc {
    unsigned long virtual; /* 映射后的虚拟地址 */
    unsigned long pfn;     /* 物理地址所在的页帧号 */
    unsigned long length;  /* 映射长度 */
    unsigned int type;     /* 映射的设备类型 */
};
pfn:利用_phys_to_pfn(物理地址)可以计算出物理地址所在的物理页帧号

问题2:内核启动时,在什么地方完成自动映射?
以s3c6410cpu为例:在arch/arm/mach-s3c64xx目录下有一个结构数组
static struct map_desc s3c_iodesc[] __initdata = { ... };
里面保存的全是这种映射关系,目录下还有个初始化函数如下:
void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
{
    unsigned long idcode;

    /* initialise the io descriptors we need for initialisation */
    iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
    ...
}
内部调用iotable_init完成映射

寄存器读写
在完成地址映射后,就可以读写寄存器了,linux内核提供了一系列的函数用来读写寄存器。
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(address)
unsigned readw(address)
unsigned readl(address)
void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
void writeb(unsigned value, address)
void writew(unsigned value, address)
void writel(unsigned value, address)

linux驱动开发前奏

标签:linux   驱动开发   硬件访问   静态映射   动态映射   

原文地址:http://blog.csdn.net/zhuwenfeng215/article/details/45225637

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!