免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1201 | 回复: 0
打印 上一主题 下一主题

linux设备驱动-platform [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-25 20:46 |只看该作者 |倒序浏览
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, 看门狗都归为平台设备.

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/97319/showart_2060186.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP