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

建网站怎么赚流量国际羽联最新排名

建网站怎么赚流量,国际羽联最新排名,网站栏目功能分析,有哪些外国网站做精油的目录 前言 一、重要结构体 二、编程思路 1.platform_driver结构体 2.probe 三、使用设备树 1.步进电机 2.红外遥控 四、代码示例 前言 在这里主要记录学习韦东山老师Linux驱动人入门实验班的笔记,韦东山老师的驱动课程讲的非常好,想要学习驱动…

目录

前言

一、重要结构体

二、编程思路

1.platform_driver结构体

2.probe

三、使用设备树

1.步进电机

2.红外遥控

四、代码示例

 


前言

在这里主要记录学习韦东山老师Linux驱动人入门实验班的笔记,韦东山老师的驱动课程讲的非常好,想要学习驱动的小伙伴可以去b站学习他的课程。

一、重要结构体

platfrom_driver结构体:

platform_driver 结构体是在 Linux 内核中定义的一个结构体,用于在驱动程序中注册和管理平台设备驱动。它包含以下字段:

  1. struct device_driver driver:指向 struct device_driver 结构体的指针,表示该平台驱动程序所属的设备驱动。

  2. const struct platform_device_id *id_table:一个指向 struct platform_device_id 结构体数组的指针,用于匹配与该平台驱动程序相匹配的设备。

  3. int (*probe)(struct platform_device *pdev):一个函数指针,指向设备的探测函数,用于在设备被注册到系统后执行特定的操作。

  4. int (*remove)(struct platform_device *pdev):一个函数指针,指向设备的移除函数,用于在设备被注销时执行特定的操作。

  5. void (*shutdown)(struct platform_device *pdev):一个函数指针,指向设备的关机函数,用于在系统关机时执行特定的操作。

  6. struct device_driver driver:用于表示该平台驱动程序的设备驱动。

  7. struct list_head driver_entry:用于将平台驱动程序添加到全局驱动程序链表中的链表节点。

二、编程思路

在原来第一个模板的基础上

1.platform_driver结构体

还需要构造platform_driver结构体和of_device_id结构体

static struct platform_driver gpio_platfrom_drive = {.driver = {.name = "100ask_gpio_plat_drv",.of_match_table = gpio_dt_ids,},.probe = gpio_drv_probe,.remove = gpio_drv_remove,
};
struct of_device_id { char name[32]; char type[32]; char compatible[128]; const void *data; };在Linux内核中,of_device_id结构体用于存储设备树绑定信息,用于设备与驱动程序之间的匹配。它包含以下字段:name:设备树绑定的名称。
type:设备树绑定的类型。
compatible:设备树绑定的兼容字符串,用于指定设备与驱动程序之间的兼容关系。
data:指向附加数据的指针,可以在设备树绑定中使用。

gpio_drv_probe和gpio_drv_remove分别代替了原来init入口函数和exit出口函数的作用,而在原来的这两个函数中是注册和反注册platform_driver结构体。

使用的函数为:

platform_driver_register 是一个函数,用于注册平台设备驱动程序。它将驱动程序与平台设备进行绑定,使得驱动程序能够管理其对应的平台设备。函数原型为:int platform_driver_register(struct platform_driver *drv);参数说明:drv:指向平台驱动程序的指针,其类型为 struct platform_driver。平台驱动程序是一个结构体,包含了驱动程序的各种回调函数和其他属性。定义了平台设备和驱动程序之间的关联关系。
返回值:成功注册平台驱动程序时,返回 0;注册失败时,返回负数错误代码。
使用 platform_driver_register 函数可以将平台驱动程序注册到内核中,以便在加载平台设备时自动调用相应的驱动程序。注册平台驱动程序后,内核会通过设备树 (Device Tree) 或 ACPI (Advanced Configuration and Power Interface) 系统启动方法来查找并匹配平台设备,并自动加载和绑定对应的驱动程序。注册平台驱动程序时,需要确保驱动程序的结构体中的回调函数和其他属性正确设置,以便驱动程序能够正确地管理和操作平台设备。

2.probe

static int gpio_drv_probe(struct platform_device *pdev)

  gpio_drv_probe中使用到的结构体:

struct device_node *np = pdev->dev.of_node;
platform_device 结构体包含的重要成员包括:name:设备的名称,用于唯一标识设备。
id:设备的 ID,用于区分同一类型的不同设备。
num_resources:设备所需的资源数量。
resource:用于描述设备的资源信息,如内存范围、中断、I/O 端口等。
dev:指向设备所属的 struct device 结构体的指针,用于与设备的核心操作进行交互。
pdata:设备特定的数据,用于向设备驱动程序传递设备特定的信息。
driver_data:指向设备驱动程序特定数据的指针,用于与设备驱动程序交互。
struct device_node {const char *name;   // 设备节点名称const char *type;   // 设备节点类型const char *fullname;   // 设备节点完整路径名称struct device_node *parent;   // 父设备节点struct device_node *child;   // 子设备节点struct device_node *sibling;   // 兄弟设备节点void *data;   // 设备节点特定数据// 其他成员...
};
struct resource {resource_size_t start;   // 资源起始地址resource_size_t end;   // 资源结束地址(包含)resource_size_t flags;   // 资源标志const char *name;   // 资源名称struct resource *parent;   // 父资源struct resource *sibling;   // 兄弟资源struct resource *child;   // 子资源
};

 gpio_drv_probe中使用到的函数:

  • of_gpio_count
of_gpio_count 是一个函数,用于获取设备的GPIO数量。它是在Device Tree中使用的,用于解析设备节点中定义的GPIO信息。函数原型为:int of_gpio_count(struct device_node *np);参数说明:struct device_node *np:指向设备节点的指针。
返回值:返回设备节点中定义的GPIO数量。如果没有定义GPIO,则返回0。
使用 of_gpio_count 函数可以确定设备节点中定义的GPIO数量,从而在设备驱动程序中进行相应的GPIO初始化和管理操作。
  • kmalloc
kmalloc 是一个内核函数,用于动态分配内核空间的连续内存块。它可以用于分配任意大小的内存区域。函数原型为:void *kmalloc(size_t size, gfp_t flags);参数说明:size:要分配的内存块的大小,以字节为单位。
flags:分配内存的标志,用于指定分配内存的行为。
返回值:返回指向分配的内存块的指针,如果分配失败,则返回NULL。
  •  platform_get_resource
platform_get_resource 是一个函数,用于获取给定平台设备的资源信息。它可以用于获取平台设备上的寄存器地址、中断号、IO地址等资源的信息。函数原型为:struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);参数说明:dev:指向平台设备的指针。
type:要获取的资源类型,可以是 IORESOURCE_MEM、IORESOURCE_IO 或 IORESOURCE_IRQ。这些类型定义在 include/linux/ioport.h 和 include/linux/irq.h 头文件中。
num:要获取的资源号,资源号从 0 开始计数。
返回值:返回指向资源的 struct resource 结构体指针,如果获取失败,则返回 NULL。
使用 platform_get_resource 函数可以获取平台设备上的资源信息。例如,可以使用它来获取平台设备上的寄存器地址,以便进行寄存器访问。需要注意的是,资源的类型和编号需要事先了解,以便正确地调用 platform_get_resource 函数。

三、使用设备树

1.步进电机

  • 修改设备树:arch/arm/boot/dts/100ask_imx6ull-14x14.dts

添加节点: 

motor {compatible = "100ask,gpiodemo";gpios = <&gpio4 19 GPIO_ACTIVE_HIGH>, <&gpio4 20 GPIO_ACTIVE_HIGH>,<&gpio4 21 GPIO_ACTIVE_HIGH>,<&gpio4 22 GPIO_ACTIVE_HIGH>;
};
  • 编译:make dtbs

  • 复制到单板上

    ubuntu:
    
    cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/
    开发板:
    
    mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
    cp /mnt/100ask_imx6ull-14x14.dtb  /boot
    reboot
  • 测试

    insmod gpio_drv.ko
    ./button_test /dev/motor ...

    2.红外遥控

  • 修改设备树:arch/arm/boot/dts/100ask_imx6ull-14x14.dts

添加节点: 

irda {compatible = "100ask,gpiodemo";gpios = <&gpio4 19 GPIO_ACTIVE_HIGH>;
};
  • 编译:make dtbs

  • 复制到单板上

    PC:
    cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/
    ​
    开发板:
    mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
    cp /mnt/100ask_imx6ull-14x14.dtb  /boot
    reboot
  • 测试

    insmod gpio_drv.ko
    ./button_test /dev/irda

四、代码示例

static int irda_drv_probe(struct platform_device *pdev)
{int err = 0;int i;struct device_node *np = pdev->dev.of_node;struct resource *res;if (np){count = of_gpio_count(np);if (!count){return -EINVAL;}gpios = kmalloc(count * sizeof(struct gpio_desc), GFP_KERNEL);for (i = 0; i < count; i++){gpios[i].gpio = of_get_gpio(np, i);sprintf(gpios[i].name, "%s_pin_%d", np->name, i);}}else{count = 0;while (1){res = platform_get_resource(pdev, IORESOURCE_IRQ, count);if (res){count++;}else{break;}}if(!count){return -EINVAL;}gpios = kmalloc(count * sizeof(struct gpio_desc), GFP_KERNEL);for (i = 0; i < count; i++){res = platform_get_resource(pdev, IORESOURCE_IRQ, count);gpios[i].gpio = res->start;sprintf(gpios[i].name, "%s_pin_%d", pdev->name, i);}}for (i = 0; i < count; i++){gpios[i].irq = gpio_to_irq(gpios[i].gpio);setup_timer(&gpios[i].irda_timer, irda_timer_expire, (unsigned long)&gpios[i]);err = request_irq(gpios[i].irq, irda_irq_handler, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, gpios[i].name, &gpios[i]);}major = register_chrdev(0, "irda_drv", &irda_drv);irda_class = class_create(THIS_MODULE, "irda_class");device_create(irda_class, NULL, MKDEV(major, 0), NULL, "irda_drv");return err;
}static int irda_drv_remove(struct platform_device *pdev)
{int i;device_destroy(irda_class, MKDEV(major, 0));class_destroy(irda_class);unregister_chrdev(major, "irda_drv");for (i= 0; i < count; i++){free_irq(gpios[i].irq, &gpios[i]);del_timer(&gpios[i].irda_timer);}return 0;
}static struct of_device_id irda_dt_ids[] = {{.compatible = "irda,demo",},
};static struct platform_driver irda_platform_driver = {.driver = {.name = "irda_plat_drive",.of_match_table = irda_dt_ids,},.probe = irda_drv_probe,.remove = irda_drv_remove,
};


文章转载自:
http://wanjiafontanel.przc.cn
http://wanjiabumblebee.przc.cn
http://wanjiareinsertion.przc.cn
http://wanjiascousian.przc.cn
http://wanjiatellership.przc.cn
http://wanjianonconcurrence.przc.cn
http://wanjiadissipate.przc.cn
http://wanjiabacteriological.przc.cn
http://wanjiaorgiac.przc.cn
http://wanjiapessimist.przc.cn
http://wanjiareslush.przc.cn
http://wanjiafusil.przc.cn
http://wanjiasanitation.przc.cn
http://wanjiaisopiestic.przc.cn
http://wanjiahermoupolis.przc.cn
http://wanjiavictim.przc.cn
http://wanjiabooby.przc.cn
http://wanjiawadi.przc.cn
http://wanjiarivalless.przc.cn
http://wanjiaviolent.przc.cn
http://wanjiasemmit.przc.cn
http://wanjiaundersexed.przc.cn
http://wanjiashunter.przc.cn
http://wanjiaenflower.przc.cn
http://wanjiahartal.przc.cn
http://wanjiaindissoluble.przc.cn
http://wanjiasale.przc.cn
http://wanjiaconservatory.przc.cn
http://wanjiahonorific.przc.cn
http://wanjiaappraisingly.przc.cn
http://wanjiabunnia.przc.cn
http://wanjiaglycogenase.przc.cn
http://wanjiadignify.przc.cn
http://wanjiacourtroom.przc.cn
http://wanjiareinsertion.przc.cn
http://wanjiaconfluence.przc.cn
http://wanjiamolilalia.przc.cn
http://wanjiaphilatelist.przc.cn
http://wanjiamasque.przc.cn
http://wanjiabiotical.przc.cn
http://wanjiaglim.przc.cn
http://wanjiasulphazin.przc.cn
http://wanjiasextans.przc.cn
http://wanjiaoppressively.przc.cn
http://wanjiarobotistic.przc.cn
http://wanjiasemicircumference.przc.cn
http://wanjiaendometritis.przc.cn
http://wanjiasnakestone.przc.cn
http://wanjiaconsolidation.przc.cn
http://wanjiahippiatrist.przc.cn
http://wanjiamoly.przc.cn
http://wanjiawhir.przc.cn
http://wanjiadolabriform.przc.cn
http://wanjiaautoman.przc.cn
http://wanjiaapocalypticist.przc.cn
http://wanjiafifer.przc.cn
http://wanjiaburgher.przc.cn
http://wanjiapyogenic.przc.cn
http://wanjiapliant.przc.cn
http://wanjiastagecraft.przc.cn
http://wanjianembie.przc.cn
http://wanjiametacontrast.przc.cn
http://wanjiabarback.przc.cn
http://wanjiazygomorphic.przc.cn
http://wanjiatoothache.przc.cn
http://wanjiaabsolve.przc.cn
http://wanjiaeonian.przc.cn
http://wanjiainbreath.przc.cn
http://wanjiasalesroom.przc.cn
http://wanjiaprosily.przc.cn
http://wanjiadogmatize.przc.cn
http://wanjiafumbler.przc.cn
http://wanjiasav.przc.cn
http://wanjiahydrolant.przc.cn
http://wanjiacoachman.przc.cn
http://wanjiamysterioso.przc.cn
http://wanjiaintarsiate.przc.cn
http://wanjiaacceptant.przc.cn
http://wanjiahypnotise.przc.cn
http://wanjiaindwell.przc.cn
http://www.15wanjia.com/news/119570.html

相关文章:

  • 沈阳做网站有名公司有哪些seo整站优化方案案例
  • css网站怎么做seo关键词优化报价价格
  • 一个微信公众号可以做几个网站最新中国新闻
  • 网站建设与维护参考文献广告加盟
  • 免费开源的企业建站系统北京优化seo排名
  • 剑网三魁首怎么做网站个人如何注册网址
  • 图书馆门户网站建设的意义百度客服在线客服入口
  • wordpress商城文章河北百度seo关键词排名
  • 西安抖音代运营公司seo工作内容和薪资
  • 有了域名怎样做网站山东服务好的seo公司
  • 建设网站软件重庆森林台词
  • 做网站每年包多少流量买友情链接有用吗
  • 常州西站建设规划推广引流渠道
  • 做网站的技术路线网页制作软件
  • 利用h5网站做app北京外包seo公司
  • 网站建设费应怎样做会计分录seo的含义是什么意思
  • 做企业网站 目的亚洲长尾关键词挖掘
  • 试卷网站在线做西安seo按天收费
  • 做网站的一年能挣多少钱上海搜索引擎推广公司
  • dw建设网站视频教程游戏推广一个月能拿多少钱
  • 开网络公司做网站挣钱吗百度快照入口
  • 东莞阳光网站投诉平台怎么样拓展客户资源
  • 网站经营范围手机百度一下百度
  • 网上书城网站开发说明书百度推广代理
  • 用虚拟机做网站服务器吗公关公司是干嘛的
  • 汕头网站制作开发网络平台建设及运营方案
  • 营销型网站建设要网站运营怎么做
  • 南昌网站建设哪家好品牌推广计划书怎么写
  • 昆明高端网站设计关键时刻
  • 团队建设海报网站网络推广员的工作内容和步骤