linux设备驱动open,linux设备驱动-platform

put_user(),get_user()为两个宏,当拷贝数据为1, 2, 4 字节时, 速度比较快.int get_user(value, address),

int put_user(expression, address), 第一个参数为内核空间的变量,第二个为一个指针,为一个用户空间地址, 传输大小由address  类型决定.

access_ok()用于检查程序是否能以指定的方式访问指定的地址指定长度的内存.

int access_ok(int type, unsigned long addr, unsigned long size)

type 为 VERIFY_READ, VERIFY_WRITE.表示需要对指定的地址的内存进行读,写操作.

addr 指定要操作的地址.

size指定需要读或写的长度.

平台设备的引入是为了能更好的描述设备的资源信息.属于platform device的设备的共同点是: 直接通过cpu的总线寻址.

平台设备对象由platform_device描述:

struct platform_device {

const char * name;

u32  id;

struct device dev;  //对应的设备

u32  num_resources; //资源的数量

struct resource * resource;  //资源信息

};

与此对应的平台设备驱动程序由struct platform_driver描述:

struct platform_driver {

int (*probe)(struct platform_device *);

int (*remove)(struct platform_device *);

void (*shutdown)(struct platform_device *);

int (*suspend)(struct platform_device *, pm_message_t state);

int (*suspend_late)(struct platform_device *, pm_message_t state);

int (*resume_early)(struct platform_device *);

int (*resume)(struct platform_device *);

struct device_driver driver;

};内核还提供了多平台设备的接口函数:

int platform_device_register(struct platform_device *pdev);

int platform_device_unregister(struct platform_device *pdev);

int platform_add_devices(struct platform_device **pdevs, int ndev);

int platform_driver_register(struct platform_driver *drv);

int platform_driver_unregister(struct platform_driver *drv);

还有一重要数据结构:

struct resource {

const char *name;

unsigned long start, end; //起始地址与终止地址

unsigned long flags;

struct resource *parent, *sibling, *child;

};

标志包括:

#define IORESOURCE_IO 0x00000100 //I/0资源

#define IORESOURCE_MEM 0x00000100 //内存资源

#define IORESOURCE_IRQ 0x00000100 //中断资源

#define IORESOURCE_DMA 0x00000100 //DMA资源

获取设备资源信息函数:

struct int platform_get_irq(struct platform_device *dev, unsigned int num);

//根据序号获取资源中的中断号。

struct resource * platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num); //根据资源类型和序号来获取指定的资源

struct resource * platform_get_resource_byname(struct platform_device *dev, unsigned int type, char *name); //根据名称和类别获取指定的资源

struct resource * platform_get_irq_byname(struct platform_device *dev, char *name); //根据名称获取资源的中断号

通过Platform机制开发发底层驱动的大致流程为:

定义 platform_device 注册 platform_device

定义 platform_driver 注册 platform_driver.S3C2440中集成的 i2C, IIS, RTC, 看门狗都归为平台设备.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值