device_driver include/linux/device.h struct device_driver {

const char             * name; /* 驱动名称 */

struct bus_type        * bus;  /* 总线类型 */

struct completion      unloaded;  /* 卸载事件通知机制 */ struct kobject                      kobj; /* sys 中的对象 */

struct klist           klist_devices; /* 设备列表 */ struct klist_node                       knode_bus; /* 总线结点列表 */

struct module          * owner;/* 所有者 */

/* 设备驱动通用方法 */

int     (*probe)    (struct device * dev); /* 探测设备 */ int    (*remove)   (struct device * dev); /* 移除设备 */ void    (*shutdown)     (struct device * dev); /* 关闭设备 */

/* 挂起设备        */

int    (*suspend)     (struct device * dev, pm_message_t state, u32 level); int       (*resume)      (struct device * dev, u32 level); /* 恢复 */

};

platform_device include/linux/device.h struct platform_device {

const char     * name;  /* 名称 */

u32            id;      /* 设备编号, -1 表示不支持同类多个设备 */ struct device dev;               /* 设备 */

u32            num_resources; /* 资源数 */ struct resource * resource; /* 资源列表 */

};

3. resource struct resource {

const char name;          /*

资源名称 */

unsigned

long start, end; /* 开始位置和结束位置 */ unsigned long flags;                         /* 资源类型 */

/* 资源在资源树中的父亲,兄弟和孩子

*/ struct resource *parent, *sibling, *child;

};

4. device include/linux/device.h

struct device {

struct klist           klist_children;

/* 在设备列表中的孩子列表 */ struct klist_node                       knode_parent;   /* 兄弟结点 */

struct

klist_node  knode_driver;   /* 驱动结点 */ struct klist_node   knode_bus;    /* 总线结点 */ struct device   parent; /* 父亲    */

struct kobject kobj;                   /* sys结点 */ char

bus_id[BUS_ID_SIZE];

struct semaphore

sem;    /* 同步驱动的信号量 */

struct bus_type * bus;        /* 总线类型         */

struct device_driver *driver;   /* 设备驱动      */ void  *driver_data;

/* 驱动的私有数据   */

void           *platform_data; /* 平台指定的数据,为 device

核心驱动保留 */ void               *firmware_data; /* 固件指定的数据,为 device

核心驱动保留 */ struct dev_pm_info

power;     /* 设备电源管理信息  */

u64            *dma_mask;      /* DMA掩码          */

u64            coherent_dma_mask;

struct

list_head dma_pools;     /* DMA缓冲池       */

struct dma_coherent_mem *dma_mem; /* 连续 DMA 内存的起始位置

*/

void    (*release)(struct device * dev);  /*

释放设置方法 */

};

nand_hw_control

include/linux/mtd/nand.h struct nand_hw_control {

spinlock_t   lock;   /* 自旋锁,用于硬件控制 */ struct nand_chip *active; /* 正在处理 MTD 设备

*/ wait_queue_head_t wq;      /* 等待队列    */

};

nand_chip

include/linux/mtd/nand.h struct nand_chip {

void    iomem   *IO_ADDR_R; /* 读地址 */ void    iomem               *IO_ADDR_W; /* 写地址 */

/* 字节操作   */

u_char         (*read_byte)(struct mtd_info *mtd);  /*

读一个字节 */

void           (*write_byte)(struct mtd_info *mtd, u_char byte); /* 写一个字节 */

/*

双字节操作 */

u16            (*read_word)(struct mtd_info mtd); /* 读一个字 */

void           (*write_word)(struct mtd_info *mtd, u16 word); /* 写一个字 */

/*

buffer 操作 */

void           (*write_buf)(struct mtd_info *mtd, const u_char *buf, int len); void               (*read_buf)(struct mtd_info

*mtd, u_char *buf, int len);

int            (*verify_buf)(struct

mtd_info *mtd, const u_char

*buf, int len);

/*

选择一个操作芯片 */

void           (*select_chip)(struct

mtd_info *mtd, int chip);

/*

坏块检查操作 */

int            (*block_bad)(struct

mtd_info *mtd, loff_t ofs, int getchip);

/*

坏块标记操作 */

int            (*block_markbad)(struct

mtd_info *mtd, loff_t ofs);

/*

硬件控制操作 */

void           (*hwcontrol)(struct

mtd_info *mtd, int cmd);

/*

设备准备操作 */

int            (*dev_ready)(struct

mtd_info *mtd);

/*

命令发送操作 */

void           (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int

page_addr);

/*

等待命令完成 */

int            (*waitfunc)(struct mtd_info

*mtd, struct nand_chip

*this, int state);

/*

计算 ECC 码操作 */

int            (*calculate_ecc)(struct

mtd_info *mtd, const u_char *dat,

u_char

*ecc_code);

/*

数据纠错操作 */

int            (*correct_data)(struct mtd_info *mtd, u_char *dat, u_char *read_ecc,

u_char *calc_ecc);

/*

开启硬件 ECC */

void           (*enable_hwecc)(struct

mtd_info *mtd, int mode);

/* 擦除操作     */

void           (*erase_cmd)(struct

mtd_info *mtd, int page);

/* 检查坏块表   */

int            (*scan_bbt)(struct

mtd_info *mtd);

int            eccmode;   /* ECC 模式      */

int            eccsize;   /* ECC 计算时使用的字节数 */

int            eccbytes;  /*

ECC 码的字节数 */

int            eccsteps;  /*

ECC 码计算的步骤数 */

int            chip_delay;

/* 芯片的延迟时间 */ spinlock_t               chip_lock;  /*

芯片访问的自旋锁 */ wait_queue_head_t wq;            /* 芯片访问的等待队列 */ nand_state_t  state;  /*

Nand Flash 状态 */

int            page_shift; /* 页右移的位数,即 column

地址位数 */

int            phys_erase_shift; /* 块右移的位数, 即 column 和页一共的地址位数 */ int               bbt_erase_shift; /* 坏块页表的位数 */

int            chip_shift; /* 该芯片总共的地址位数 */

u_char         *data_buf;  /*

数据缓冲区 */

u_char         *oob_buf;  /*

oob 缓冲区 */

int            oobdirty;  /*

oob 缓冲区是否需要重新初始化 */

u_char         *data_poi;  /* 数据缓冲区指针 */ unsigned int               options;   /*

芯片专有选项 */

int            badblockpos;/* 坏块标示字节在 OOB 中的位置 */

int            numchips;  /* 芯片的个数   */

unsigned

long

chipsize;

/*

在多个芯片组中, 一个芯片的大小 */

int

pagemask;

/* 每个芯片页数的屏蔽字, 通过它取出每个芯片包含多少个页 */

int

pagebuf;

/*

在页缓冲区中的页号 */

struct nand_oobinfo    *autooob; /* oob 信息 */ uint8_t  *bbt;                      /* 坏块页表 */

struct nand_bbt_descr               *bbt_td;

/* 坏块表描述 */

struct nand_bbt_descr  *bbt_md; /*

坏块表镜像描述 */

struct nand_bbt_descr  *badblock_pattern; /* 坏块检测模板 */

struct nand_hw_control *controller; /* 硬件控制 */

void           *priv;

/* 私有数据结构 */

/*

进行附加错误检查 */

int            (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page);

};

mtd_info include/linux/mtd/mtd.h struct mtd_info {

u_char type;   /* 设备类型   */ u_int32_t flags; /* 设备标志位组 */ u_int32_t

size; /* 总共设备的大小 */ u_int32_t

erasesize;  /* 擦除块的大小 */

u_int32_t

oobblock; /* OOB 块的大小,如:512 个字节有一个 OOB */ u_int32_t oobsize; /* OOB数据的大小,如:一个 OOB 块有 16 个字节

*/ u_int32_t ecctype; /* ECC 校验的类型 */

u_int32_t eccsize;  /* ECC 码的大小  */

char

*name;        /* 设备名称       */

int

index;         /* 设备编号       */

/* oobinfo

信息,它可以通过 MEMSETOOBINFO ioctl 命令来设置 */ struct nand_oobinfo oobinfo;

u_int32_t

oobavail;  /* OOB区的有效字节数,为文件系统提供 */

/* 数据擦除边界信息         */

int numeraseregions;

struct mtd_erase_region_info *eraseregions;

u_int32_t

bank_size; /* 保留 */

/*

擦除操作 */

int (*erase) (struct mtd_info *mtd,

struct erase_info *instr);

/* 指向某个执行代码位置 */

int (*point) (struct mtd_info *mtd,

loff_t from,

size_t len, size_t *retlen, u_char **mtdbuf);

/*

取消指向 */

void (*unpoint)

(struct mtd_info *mtd, u_char *

addr, loff_t from, size_t len);

/*

读/写操作 */

int (*read) (struct

mtd_info *mtd, loff_t

from, size_t len, size_t *retlen, u_char *buf); int (*write) (struct mtd_info

*mtd, loff_t to, size_t

len,

size_t *retlen, const u_char *buf);

/* 带 ECC 码的读/写操作 */

int

(*read_ecc) (struct mtd_info

*mtd, loff_t from, size_t len,

size_t *retlen, u_char *buf,

u_char *eccbuf, struct nand_oobinfo *oobsel);

int (*write_ecc) (struct mtd_info

*mtd, loff_t to, size_t len, size_t *retlen,

const u_char *buf, u_char *eccbuf, struct

nand_oobinfo *oobsel);

/* 带 OOB 码的读/写操作 */

int

(*read_oob) (struct mtd_info

*mtd, loff_t from, size_t len,

size_t *retlen, u_char *buf);

int

(*write_oob) (struct mtd_info

*mtd, loff_t to, size_t

len, size_t *retlen, const u_char *buf);

/* 提供访问保护寄存器区的方法 */

int (*get_fact_prot_info) (struct

mtd_info *mtd, struct

otp_info *buf, size_t

len); int (*read_fact_prot_reg) (struct

mtd_info *mtd, loff_t

from, size_t len,

size_t *retlen, u_char *buf);

int (*get_user_prot_info) (struct

mtd_info *mtd, struct

otp_info *buf, size_t

len); int (*read_user_prot_reg) (struct

mtd_info *mtd, loff_t

from, size_t len,

size_t *retlen, u_char *buf);

int (*write_user_prot_reg) (struct

mtd_info *mtd, loff_t from, size_t len,

size_t *retlen, u_char *buf);

int (*lock_user_prot_reg) (struct

mtd_info *mtd, loff_t from, size_t len);

/* 提供 readv

和 writev 方法         */

int

(*readv) (struct mtd_info

*mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen);

int

(*readv_ecc) (struct mtd_info

*mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen, u_char *eccbuf,

struct nand_oobinfo *oobsel);

int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);

int (*writev_ecc) (struct mtd_info

*mtd, const struct kvec *vecs,

unsigned long count, loff_t to, size_t *retlen, u_char *eccbuf, struct

nand_oobinfo *oobsel);

/*

同步操作 */

void (*sync) (struct mtd_info *mtd);

/* 芯片级支持的加/解锁操作 */

int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);

int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);

/* 电源管理操作           */

int (*suspend) (struct mtd_info *mtd); void (*resume) (struct mtd_info *mtd);

/* 坏块管理操作           */

int (*block_isbad) (struct mtd_info *mtd, loff_t ofs); int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);

/* 重启前的通知事件        */

struct

notifier_block reboot_notifier; void *priv; /* 私有数据结构 */

struct module

*owner; /* 模块所有者 */ int usecount; /* 使用次数 */

};

Linux创始人数据结构,Linux 通用数据结构说明相关推荐

  1. linux 进程数据结构,Linux进程数据结构详解

    1.Linux的进程简介: 支持多线程的操作系统中,进程是资源分配的最小单位,线程是调度的基本单位.Linux是现代的32位或64位的支持多线程的操作系统,不过Linux是一种以轻量级进程作为线程,多 ...

  2. Linux文件系统之:通用块处理层 ll_rw_block | +往期文章回顾

    </proc 文件系统并使用/proc 进行输入> <Linux虚拟文件系统概述> <Linux文件系统概述:硬盘驱动>通用块设备层>文件系统>虚拟文件 ...

  3. Linux内核总线系统 —— 通用总线和平台设备

    在 Linux内核输入子系统框架_Bin Watson的博客-CSDN博客 这篇文章中,我们详细分析了输入子系统.了解到了 dev 和 handler 分层的思想.而在 jz2440_输入子系统驱动程 ...

  4. Linux创始人:v5.8是有史以来最大的发行版之一

    导语 Linux v5.8已经修改了所有文件的20%,是迄今为止变化最大的一次发行版. 正文 Linux创始人Linus Torvalds表示:Linux内核5.8版是"我们有史以来最大的发 ...

  5. c语言系统的通用数据结构,(转载)C语言实现通用数据结构的高效设计

    (转载)C语言实现通用数据结构的高效设计 [复制链接] 使用宏替代模板的方案 最近在阅读一个开源的C++代码,里面用到了大量的STL里面的东西.也许是自己一直用C而很少用C++来实现算法的原因,STL ...

  6. Linux创始人Linus Torvalds怒怼Intel:正视问题而不是搞公关才是正事

    本文由 「AI前线」原创,原文链接:Linux创始人Linus Torvalds怒怼Intel:正视问题而不是搞公关才是正事 作者|Agam Shah,Linus Torvalds 译者|Debra ...

  7. 一步一步写算法(之通用数据结构)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上一篇博客介绍了通用算法,那么有了这个基础我们可以继续分析通用数据结构了.我们知道在c++里面 ...

  8. 通用程序算法和数据结构_了解通用数据结构

    通用程序算法和数据结构 In this article, I am going to walk you through the concepts of the common Data Structur ...

  9. c语言通用数据结构和常用算法库,基于C语言的通用数据结构和算法库

    本人最近在学习数据结构的课程,在过程中发现用C语言来实现各种数据结构类型的时候很难做到真正意义上的通用的数据结构,于是在网上搜罗了一些所谓的C语言通用数据结构库,在此也将这些数据结构库一一罗列,方便大 ...

  10. linux安装南大通用数据库 GBase 8s V8.8

    linux安装南大通用数据库 GBase 8s V8.8 1.操作系统.数据库 2.下载链接 3.安装文档 4.安装前准备 4.1.以root用户创建 gbasedbt 组和用户 4.2.创建 GBa ...

最新文章

  1. linux shell rman删除归档_Oracle备份恢复必会--rman迁移,附实验步骤介绍
  2. 字体大小的设置_老年人用智能手机,怎样更改字体大小?3种方法,手把手教您学会...
  3. 内网渗透-2019/06/06
  4. [密码学] RSA利用解密指数分解n
  5. boost::hana::greater用法的测试程序
  6. fluent瞬态_Java中的瞬态关键字及其使用
  7. android 冰箱 活动,Android活动的使用
  8. PHP与MySQL外文文献译文和原文_读懂外文文献的秘诀在这里丨49周新闻
  9. php7.2.2 配置数据库连接,Tp5连接sql server数据库(更新:PHP7.2加载不懂sqlsrv扩展)...
  10. 疯狂工作流讲义(第2版)基于Activiti6.x电子书
  11. GDB调试的一系列博客
  12. EverEdit 4.2.0.4457 免安装已激活 x64
  13. icem密度盒怎么设置_ICEM学习笔记
  14. 写给 Linux 初学者的一封信
  15. 【PPT】跨境电商的N个知识点普及
  16. JO Smart聚视频 TV端软件
  17. Android之高德地图SDK配置及简单使用详解
  18. Typora快捷键全
  19. Python人脸识别项目-人脸识别-获取人脸图片
  20. [PowerBI]DAX虚拟连接函数:TREATAS()用法介绍

热门文章

  1. 天线接收功率计算公式_对讲机天线到底有多重要?通信效果好不好全靠它了!...
  2. 编写一个C程序,实现以下功能:定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中
  3. linux php 添加gd,linux(centos)下为php添加添加GD扩展
  4. php 内存队列,memcache构建简单的内存消息队列_PHP教程
  5. linux shell 获取参数 $,Linux - Shell - 参数获取
  6. 品质主管每日工作需要做哪些_做微信社群运营需要用到哪些工具来铺助工作呢?...
  7. 初识C++之函数重载
  8. python导入包的输入法_python 模块和包的导入
  9. git merging 怎么处理_如何让 Git 的输出对代码更友好?
  10. java趣味_Java趣味分享:try finally