; // 0 代表 reset 設(shè)備id,id是自定義的,但是不能超過(guò) reset 驅(qū)動(dòng)中指定的設(shè)備個(gè)數(shù) ......}; 驅(qū)動(dòng)編寫" />

一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核reset驅(qū)動(dòng)實(shí)例

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-09-27 14:21 ? 次閱讀

reset驅(qū)動(dòng)實(shí)例

類似于clock驅(qū)動(dòng),reset驅(qū)動(dòng)也是編進(jìn)內(nèi)核的,在Linux啟動(dòng)時(shí),完成reset驅(qū)動(dòng)的加載。

設(shè)備樹(shù)

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

上述是一個(gè)reset控制器的節(jié)點(diǎn),0xc0000000是寄存器基址,0x1000是映射大小。#reset-cells代表引用該reset時(shí)需要的cells個(gè)數(shù)。

例如,#reset-cells = <1>; 則正確引用為:

mmc:mmc@0x12345678{
    ......
    resets = < &reset  0 >;//0代表reset設(shè)備id,id是自定義的,但是不能超過(guò)reset驅(qū)動(dòng)中指定的設(shè)備個(gè)數(shù)
    ......
};

驅(qū)動(dòng)編寫

reset驅(qū)動(dòng)編寫的基本步驟:

1、實(shí)現(xiàn)struct reset_control_ops結(jié)構(gòu)體中的.reset、.assert.deassert、.status函數(shù)

2、分配struct reset_controller_dev結(jié)構(gòu)體,填充opsowner、nr_resets等成員內(nèi)容

3、調(diào)用reset_controller_register函數(shù)注冊(cè)reset設(shè)備

以下是從實(shí)際項(xiàng)目中分離出來(lái)的reset驅(qū)動(dòng)代碼:

#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 >

// 自定義芯片廠的結(jié)構(gòu)體,保存寄存器基址等信息
struct xx_reset{
 struct reset_controller_dev rcdev;
 void __iomem *base;
    //......
};


static int xx_reset(struct reset_controller_dev *rcdev, unsigned long id)
{
 //操作寄存器:先復(fù)位,延遲一會(huì),然后解復(fù)位
 return 0;
}

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

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

static int xx_reset_status(struct reset_controller_dev *rcdev, unsigned long id)
{
 //操作寄存器:獲取復(fù)位狀態(tài)
 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操作函數(shù)集合
 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設(shè)備個(gè)數(shù)

 return reset_controller_register(&xx_reset- >rcdev);//注冊(cè)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");
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1405

    瀏覽量

    40973
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1882

    瀏覽量

    86372
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11425

    瀏覽量

    212404
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux clock子系統(tǒng)及驅(qū)動(dòng)實(shí)例

    Linux驅(qū)動(dòng)中,操作時(shí)鐘只需要簡(jiǎn)單調(diào)用內(nèi)核提供的通用接口即可,clock驅(qū)動(dòng)通常是由芯片廠商開(kāi)發(fā)的,在Linux啟動(dòng)時(shí)clock
    發(fā)表于 05-31 16:10 ?1076次閱讀
    <b class='flag-5'>Linux</b> clock子系統(tǒng)及<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>實(shí)例</b>

    Linux reset子系統(tǒng)及驅(qū)動(dòng)實(shí)例

    上篇講了Linux clock驅(qū)動(dòng),今天說(shuō)說(shuō)Linuxreset驅(qū)動(dòng)。
    發(fā)表于 05-31 16:16 ?1405次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>reset</b>子系統(tǒng)及<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>實(shí)例</b>

    Linux內(nèi)核空間設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)

    本文詳細(xì)介紹了Linux平臺(tái)下內(nèi)核空間設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)。在比較proc和dev兩種文件系統(tǒng)的基礎(chǔ)上,分別以PCI設(shè)備和USB設(shè)備的驅(qū)動(dòng)程序開(kāi)發(fā)為實(shí)
    發(fā)表于 08-19 08:44 ?18次下載

    LINUX內(nèi)核驅(qū)動(dòng)第三版(中文)

    LINUX內(nèi)核驅(qū)動(dòng)第三版(中文)
    發(fā)表于 03-11 09:18 ?0次下載

    Android的Linux內(nèi)核驅(qū)動(dòng)程序開(kāi)發(fā)教程

    Android內(nèi)核是基于Linux 2.6內(nèi)核的,它是一個(gè)增強(qiáng)內(nèi)核版本,除了修改部分Bug外,它提供了用于支持Android平臺(tái)的設(shè)備驅(qū)動(dòng)
    發(fā)表于 09-05 14:24 ?335次下載
    Android的<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>與<b class='flag-5'>驅(qū)動(dòng)</b>程序開(kāi)發(fā)教程

    基于Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究

    Linux因其完全開(kāi)放的特性和穩(wěn)定優(yōu)良的性能深受歡迎,當(dāng)推出了內(nèi)核輸入子系統(tǒng)后,更方便了嵌入式領(lǐng)域的驅(qū)動(dòng)開(kāi)放。介紹了Linux的設(shè)備驅(qū)動(dòng)基礎(chǔ)
    發(fā)表于 09-12 16:38 ?23次下載

    linux內(nèi)核驅(qū)動(dòng)第三版

    電子發(fā)燒友網(wǎng)站提供《linux內(nèi)核驅(qū)動(dòng)第三版.txt》資料免費(fèi)下載
    發(fā)表于 04-04 23:40 ?0次下載

    linux2.6內(nèi)核設(shè)備驅(qū)動(dòng)模型精華

    linux 內(nèi)核驅(qū)動(dòng)部分詳解
    發(fā)表于 04-27 10:43 ?20次下載

    Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究

    Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究
    發(fā)表于 10-31 14:41 ?14次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>輸入子系統(tǒng)的<b class='flag-5'>驅(qū)動(dòng)</b>研究

    Linux內(nèi)核與Android的關(guān)系

    Android雖然建立在Linux內(nèi)核之上,但是他對(duì)內(nèi)核進(jìn)行了一些擴(kuò)展,增加了一些驅(qū)動(dòng)。比如Binder,loger等等驅(qū)動(dòng)??梢阅肁ndr
    發(fā)表于 09-09 09:10 ?4702次閱讀

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

    busybox是如何運(yùn)行這個(gè)命令,同時(shí)又是如何調(diào)用到Linux內(nèi)核中的mach_reset中的arch_reset,當(dāng)針對(duì)不同的ARM芯片時(shí),作為L
    發(fā)表于 05-05 14:31 ?2629次閱讀
    基于<b class='flag-5'>Linux</b>與Busybox的Reboot命令流程分析

    如何使用Linux內(nèi)核實(shí)現(xiàn)USB驅(qū)動(dòng)程序框架

    Linux內(nèi)核提供了完整的USB驅(qū)動(dòng)程序框架。USB總線采用樹(shù)形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。 Linux內(nèi)核從主機(jī)和設(shè)備兩個(gè)角度
    發(fā)表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>實(shí)現(xiàn)USB<b class='flag-5'>驅(qū)動(dòng)</b>程序框架

    Linux內(nèi)核代碼60%都是驅(qū)動(dòng)?

    為什么Linux內(nèi)核代碼60%都是驅(qū)動(dòng)? 如果每支持新的設(shè)備就加入驅(qū)動(dòng),內(nèi)核會(huì)不會(huì)變得越來(lái)越臃腫?
    的頭像 發(fā)表于 07-11 11:48 ?1226次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>代碼60%都是<b class='flag-5'>驅(qū)動(dòng)</b>?

    Linux reset子系統(tǒng)有什么功能

    Linux reset子系統(tǒng) reset子系統(tǒng)非常簡(jiǎn)單,與clock子系統(tǒng)非常類似,但在驅(qū)動(dòng)實(shí)現(xiàn)上,reset
    的頭像 發(fā)表于 09-27 14:06 ?947次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>reset</b>子系統(tǒng)有什么功能

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng)中,驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們?cè)试S內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。 驅(qū)動(dòng)程序的編寫
    的頭像 發(fā)表于 08-30 15:02 ?878次閱讀