; // 0 代表 reset 设备id,id是自定义的,但是不能超过 reset 驱动中指定的设备个数 ......}; 驱动编写" />
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核reset驱动实例

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者:Vincent 2023-09-27 14:21 次阅读

reset驱动实例

类似于clock驱动,reset驱动也是编进内核的,在Linux启动时,完成reset驱动的加载。

设备树

reset:reset-controller{
 compatible = "xx,xx-reset";
 reg = < 0x0 0xc0000000 0x0 0x1000 >;
 #reset-cells = < 1 >;
};

上述是一个reset控制器的节点,0xc0000000是寄存器基址,0x1000是映射大小。#reset-cells代表引用该reset时需要的cells个数。

例如,#reset-cells = <1>; 则正确引用为:

mmc:mmc@0x12345678{
    ......
    resets = < &reset  0 >;//0代表reset设备id,id是自定义的,但是不能超过reset驱动中指定的设备个数
    ......
};

驱动编写

reset驱动编写的基本步骤:

1、实现struct reset_control_ops结构体中的.reset.assert.deassert.status函数

2、分配struct reset_controller_dev结构体,填充opsownernr_resets等成员内容

3、调用reset_controller_register函数注册reset设备

以下是从实际项目中分离出来的reset驱动代码:

#include < linux/of.h >
#include < linux/module.h >
#include < linux/of_device.h >
#include < linux/reset-controller.h >
#include < linux/io.h >
#include < linux/delay.h >

// 自定义芯片厂的结构体,保存寄存器基址等信息
struct xx_reset{
 struct reset_controller_dev rcdev;
 void __iomem *base;
    //......
};


static int xx_reset(struct reset_controller_dev *rcdev, unsigned long id)
{
 //操作寄存器:先复位,延迟一会,然后解复位
 return 0;
}

static int xx_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
{
 //操作寄存器:复位
 return 0;
}

static int xx_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
{
 //操作寄存器:解复位
 return  0;
}

static int xx_reset_status(struct reset_controller_dev *rcdev, unsigned long id)
{
 //操作寄存器:获取复位状态
 return 0; 
}

static struct reset_control_ops xx_reset_ops = {
 .rest = xx_rest,
 .assert = xx_reset_asser,
 .deassert = xx_reset_deassert,
 .status = xx_rest_status,
};

static int xx_reset_probe(struct platform_device *pdev)
{
 struct xx_reset *xx_reset;
 struct resource *res;
 
 xx_reset = devm_kzalloc(&pdev- >dev, sizeof(*xx_reset), GFP_KERNEL);
 if (!xx_reset)
  return -ENOMEM;

 platform_set_drvdata(pdev, xx_reset);

 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 xx_reset- >base = devm_ioremap_resource(&pdev- >dev, res);//映射寄存器基址
 if (IS_ERR(xx_reset- >base))
  return PTR_ERR(xx_reset- >base);

 xx_reset- >rcdev.ops = &xx_reset_ops;//reset_ops操作函数集合
 xx_reset- >rcdev.owner = THIS_MODULE;
 xx_reset- >rcdev.of_node = pdev- >dev.of_node;
 xx_reset- >rcdev.of_reset_n_cells = 1;  
 xx_reset- >rcdev.nr_resets = BITS_PER_LONG;//reset设备个数

 return reset_controller_register(&xx_reset- >rcdev);//注册reset controller
 
}


static int xx_reset_remove(struct platform_device *pdev)
{
 struct xx_reste *xx_reset = platform_get_drvdata(pdev);
 
 reset_controller_unregister(&xx_reset- >rcdev);
 return 0;
}

static const struct of_device_id ak_reset_of_match[]={
 {.compatible = "xx,xx-reset"},
 {},
};

MODULE_DEVICE_TABLE(of, xx_reset_of_match);

static struct platform_driver xx_reset_driver = {
 .probe = xx_reset_probe,
 .remove = xx_reset_remove,
 .driver = {
  .name = "xx-reset",
  .of_match_table = ak_reset_of_match,
 },
};


module_platorm_driver(xx_reset_driver);

MODULE_LICENSE("GPL");
MODULE_DESCPRIPTION("xx reset controller driver");
MODULE_AUTHOR("xx Microelectronic");
MODULE_VERSION("v1.0.00");
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1363

    浏览量

    40228
  • 驱动
    +关注

    关注

    12

    文章

    1825

    浏览量

    85178
  • Linux
    +关注

    关注

    87

    文章

    11229

    浏览量

    208927
收藏 人收藏

    评论

    相关推荐

    Linux clock子系统及驱动实例

    Linux驱动中,操作时钟只需要简单调用内核提供的通用接口即可,clock驱动通常是由芯片厂商开发的,在Linux启动时clock
    发表于 05-31 16:10 762次阅读
    <b class='flag-5'>Linux</b> clock子系统及<b class='flag-5'>驱动</b><b class='flag-5'>实例</b>

    Linux reset子系统及驱动实例

    上篇讲了Linux clock驱动,今天说说Linuxreset驱动
    发表于 05-31 16:16 1064次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>reset</b>子系统及<b class='flag-5'>驱动</b><b class='flag-5'>实例</b>

    Linux内核空间设备驱动程序的开发

    本文详细介绍了Linux平台下内核空间设备驱动程序的开发。在比较proc和dev两种文件系统的基础上,分别以PCI设备和USB设备的驱动程序开发为
    发表于 08-19 08:44 18次下载

    LINUX内核驱动第三版(中文)

    LINUX内核驱动第三版(中文)
    发表于 03-11 09:18 0次下载

    Android的Linux内核驱动程序开发教程

    Android内核是基于Linux 2.6内核的,它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动
    发表于 09-05 14:24 335次下载
    Android的<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>与<b class='flag-5'>驱动</b>程序开发教程

    基于Linux内核输入子系统的驱动研究

    Linux因其完全开放的特性和稳定优良的性能深受欢迎,当推出了内核输入子系统后,更方便了嵌入式领域的驱动开放。介绍了Linux的设备驱动基础
    发表于 09-12 16:38 23次下载

    linux内核驱动第三版

    电子发烧友网站提供《linux内核驱动第三版.txt》资料免费下载
    发表于 04-04 23:40 0次下载

    linux2.6内核设备驱动模型精华

    linux 内核驱动部分详解
    发表于 04-27 10:43 20次下载

    Linux内核输入子系统的驱动研究

    Linux内核输入子系统的驱动研究
    发表于 10-31 14:41 14次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>输入子系统的<b class='flag-5'>驱动</b>研究

    Linux内核与Android的关系

    Android虽然建立在Linux内核之上,但是他对内核进行了一些扩展,增加了一些驱动。比如Binder,loger等等驱动。可以拿Andr
    发表于 09-09 09:10 4575次阅读

    基于Linux与Busybox的Reboot命令流程分析

    busybox是如何运行这个命令,同时又是如何调用到Linux内核中的mach_reset中的arch_reset,当针对不同的ARM芯片时,作为L
    发表于 05-05 14:31 2510次阅读
    基于<b class='flag-5'>Linux</b>与Busybox的Reboot命令流程分析

    如何使用Linux内核实现USB驱动程序框架

    Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。 Linux内核从主机和设备两个角度
    发表于 11-06 17:59 20次下载
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>实现USB<b class='flag-5'>驱动</b>程序框架

    Linux内核代码60%都是驱动

    为什么Linux内核代码60%都是驱动? 如果每支持新的设备就加入驱动内核会不会变得越来越臃肿?
    的头像 发表于 07-11 11:48 871次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>代码60%都是<b class='flag-5'>驱动</b>?

    Linux reset子系统有什么功能

    Linux reset子系统 reset子系统非常简单,与clock子系统非常类似,但在驱动实现上,reset
    的头像 发表于 09-27 14:06 733次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>reset</b>子系统有什么功能

    linux驱动程序如何加载进内核

    Linux系统中,驱动程序是内核与硬件设备之间的桥梁。它们允许内核与硬件设备进行通信,从而实现对硬件设备的控制和管理。 驱动程序的编写
    的头像 发表于 08-30 15:02 381次阅读