当前位置: 首页 > wzjs >正文

福州网站开发私人小程序推广网站

福州网站开发私人,小程序推广网站,编程课程收费标准,科技型中小企业认定条件1. module_init 与 module_exit 这两个是在模块加载和卸载时需要使用 流程1: module_init -> spi_register_driver2. 驱动开发填充两个结构体 XXX_device xxx_driver(spi_driver) 3. 定义一个spi_driver,里面包含了device_dr…

在这里插入图片描述

1. module_init 与 module_exit 这两个是在模块加载和卸载时需要使用

流程1: module_init -> spi_register_driver

2. 驱动开发填充两个结构体 XXX_device xxx_driver(spi_driver)

3. 定义一个spi_driver,里面包含了device_driver 基类

1)在spi_register_driver时,匹配会去执行probe函数
2)id_table 和driver结构体中,填充和device匹配的名称

struct spi_driver {const struct spi_device_id *id_table;int                     (*probe)(struct spi_device *spi);int                     (*remove)(struct spi_device *spi);void                    (*shutdown)(struct spi_device *spi);struct device_driver    driver;
};
流程2spi_register_driver(spi_driver) -> __spi_register_driver(spi_driver) -> driver_register(device_driver) ->  bus_add_driver(device_driver) -> driver_attach(device_driver) -> __driver_attach(在driver注册的总线bus_type上找设备(spi_device))  -> really_probe -> probe(回调到spi_driver)

设备树解析
设备树中的设备(device)是用来描述硬件资源的存在
被内核解析,生成一个 struct device_node;
再由 platform 总线(或其他总线)创建 platform_device/ spi_device等对象;
匹配上驱动的 platform_driver 后调用驱动中的 probe() 函数;

4. 定义一个XXX_device

1) spi_driver 中的probe函数执行
2) 创建cdev设备,这个是给用户层的接口,供用户进行系统调用
3) 创建类class_create
4) 根据定义的XXX_device创建设备

流程3probe(回调到spi_driver) -> cdev_add (创建cdev设备,设备中包含ops调用接口) -> class_create(创建类) -> device_create(创建 /dev 节点,并连接到类 以及cdev设备接口)
struct xxx_dev
{dev_t devid;                                                    /* 设备号 */                                 struct cdev cdev;                                               /* cdev */struct class *class;                                    /* 类 */struct device *device;                                  /* 设备 */struct device_node *nd;                                 /* 设备节点 */int major;                                                              /* 主设备号 */int pdwn_gpio;int cs_gpio;                                                    /* cs所使用的GPIO编号 */int reset_gpio;                                                 /* reset所使用的GPIO编号 */int drdy_gpio;                                                  /* drdy所使用的GPIO编号 */unsigned char channels[8];                              /* 采样通道,最多8个 */unsigned char channel_num;                              /* 采样通道数量 */int delay_us;                                                   /* 采样间隔时间 */void *private_data;                                             /* 私有数据 */
};

匹配结构体流程如下:

在这里插入图片描述


升入剖析下结构体的定义:(ads1256 spi 设备)

平台驱动结构体

static struct spi_driver ads1256_driver = { .probe = ads1256_probe,.remove = ads1256_remove,.driver = { .owner = THIS_MODULE,.name = "ads1256",                                                                                   .of_match_table = ads1256_of_match,},  .id_table = ads1256_id,
};

为什么是上面定义(总线设备驱动模型)

  1. spi_driver 承载着总线驱动的功能,当总线驱动注册时,找到匹配的总线设备后,需要执行我们的回调函数probe函数。
  2. 当卸载时,我们需要remove相应总线下的子设备。
  3. 其他的是需要与总线设备匹配的总线驱动名称。

平台设备结构体

struct spi_device {struct device           dev;struct spi_master       *master;u32                     max_speed_hz;u8                      chip_select;u8                      bits_per_word;u16                     mode;int                     irq;void                    *controller_state;void                    *controller_data;char                    modalias[SPI_NAME_SIZE];int                     cs_gpio;        /* chip select gpio *//* the statistics */struct spi_statistics   statistics;
};
  1. 平台设备也作为一个设备存在dev,也是作为一个设备注册。
  2. 平台设备作为主设备时的一些参数
  3. 其他就是spi设备的一些具体参数,中断号、模式 、速度等。

spi平台设备下具体设备

struct ads1256_dev
{dev_t devid;                                                    /* 设备号 */struct cdev cdev;                                               /* cdev */struct class *class;                                    /* 类 */struct device *device;                                  /* 设备 */struct device_node *nd;                                 /* 设备节点 */int major;                                                              /* 主设备号 */int pdwn_gpio;int cs_gpio;                                                    /* cs所使用的GPIO编号 */int reset_gpio;                                                 /* reset所使用的GPIO编号 */int drdy_gpio;                                                  /* drdy所使用的GPIO编号 */unsigned char channels[8];                              /* 采样通道,最多8个 */unsigned char channel_num;                              /* 采样通道数量 */int delay_us;                                                   /* 采样间隔时间 */void *private_data;                                             /* 私有数据 */
};
  1. 作为一个设备注册device
  2. 所属类class
  3. 字符设备cdev
  4. 以及具体设备的一些数据参数
http://www.dtcms.com/wzjs/594891.html

相关文章:

  • 网站建设需要度搜去深圳营销培训班
  • 济南seo网站关键词优化排名如何建立营销型网站
  • 官方网站是指哪个网站龙岗南联网站建设
  • 电影网站建设内容做虚假彩票网站判几年
  • 广西建设厅网站绿色建筑标识个人开小公司的流程
  • 芜湖服装网站建设南通制作手机网站
  • 湖南兼职网站建设大型网站建设套餐
  • 饰品做国际贸易哪些网站python 做网站相关的库
  • 如何做网站seo排名优化北京网站模板
  • 中国都有哪些网站wordpress 未加密
  • 自己做网站需要哪些软件wordpress仿魔客吧
  • 网站开发专业百度地图网页版
  • 高端婚纱摄影网站失信人员黑名单查询
  • 建立网站用英语小红书关键词排名优化
  • 龙岩做网站开发找哪家推荐做pc端网站
  • 外贸建站 宁波做球服的网站有哪些
  • 建立soho公司网站房地产最新消息
  • 网站建设什么专业北京终端区优化
  • 建设公司网站需要什么科目WordPress伪静态公告404
  • 佳木斯建网站的做商城网站要哪些流程
  • 网站空间怎么买网站策划招聘
  • 安徽省建设监理有限公司网站多少钱算网站
  • 图书馆网站参考咨询建设美橙建站怎么样
  • 做网络营销推广苏州网站建设优化过哦
  • 钢格板保定网站建设通州微网站优化
  • 电器类网站设计网站屏蔽ip
  • 商城网站网络公司河南能源企业网站建设
  • 公司网站怎么弄.la域名的门户网站
  • 网站怎么添加二级域名有什么做兼职的好的网站
  • 好品质自适应网站建设wordpress 自己做主页