【Linux驅動開發 ---- 4.2_平臺設備(Platform Devices)概述】

Linux驅動開發 ---- 4.2_平臺設備(Platform Devices)概述

目錄

  • Linux驅動開發 ---- 4.2_平臺設備(Platform Devices)概述
      • 前述
      • 主要特點:
      • 平臺設備的作用
      • 平臺設備的注冊與注銷
        • 1. `platform_device_register_simple()`
        • 2. `platform_device_unregister()`
      • 平臺設備注冊示例
        • 示例代碼:
      • 代碼詳細解釋
      • 編譯與加載
        • 1. 創建 `Makefile` 文件
        • 2. 編譯內核模塊
        • 3. 加載模塊
        • 4. 查看設備
        • 5. 卸載模塊
        • 6. 清理編譯文件
      • 總結

前述

在嵌入式系統中,平臺設備(Platform Devices)用于表示硬件設備,通常是與特定平臺(如 ARM、MIPS 等)相關聯的設備。平臺設備不依賴于特定的總線(例如 PCI、USB 等),而是通過靜態配置或設備樹(Device Tree)來進行配置。平臺設備廣泛應用于嵌入式硬件,如 GPIO、SPI、I2C 控制器、內存等。

主要特點:

  1. 無需總線支持: 與常見的 PCI 或 USB 設備不同,平臺設備直接與硬件平臺相關聯,不需要外部總線支持。
  2. 靜態配置: 配置通常通過設備樹(Device Tree)或靜態方式進行,而不是動態的總線掃描。
  3. 注冊方式: 平臺設備使用 platform_device_register()platform_driver_register() 來注冊。

平臺設備的作用

平臺設備通常用于嵌入式系統中,表示直接連接到處理器或 SoC(系統級芯片)的硬件設備。這些設備的驅動程序在內核中注冊,并且設備通常在啟動時通過設備樹或手動配置進行注冊。常見的硬件如:

  • GPIO 控制器
  • SPI 控制器
  • I2C 控制器
  • UART 設備
  • 內存映射設備(如 RAM、EEPROM)

平臺設備的注冊與注銷

1. platform_device_register_simple()

該函數是一個簡單的接口,用于注冊一個平臺設備。它將設備的名稱、設備 ID、設備資源等信息注冊到內核中。

2. platform_device_unregister()

該函數用于注銷一個平臺設備,將設備從系統中刪除。

平臺設備注冊示例

在以下代碼中,我們通過 platform_device_register_simple() 來注冊一個平臺設備,使用 platform_device_unregister() 來注銷設備。

示例代碼:
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/kernel.h>
#include <linux/init.h>// 設備對象指針
static struct platform_device *pdev;// 初始化函數
static int __init platform_dev_init(void)
{// 注冊平臺設備pdev = platform_device_register_simple("my_platform_device", -1, NULL, 0);if (IS_ERR(pdev)) {pr_err("Failed to register platform device\n");return PTR_ERR(pdev);}pr_info("Platform device registered successfully\n");return 0;
}// 卸載函數
static void __exit platform_dev_exit(void)
{// 注銷平臺設備platform_device_unregister(pdev);pr_info("Platform device unregistered successfully\n");
}module_init(platform_dev_init);
module_exit(platform_dev_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple platform device registration example");

代碼詳細解釋

  1. platform_device_register_simple()

    • platform_device_register_simple() 是一個簡化的接口,用于注冊一個平臺設備。
    • 參數說明:
      • "my_platform_device":設備的名稱(設備在 /sys/class/platform/ 下的目錄名稱)。
      • -1:設備 ID(通常是一個唯一標識符,-1 表示自動分配一個設備 ID)。
      • NULL:設備資源(如內存、IO 地址等)。此處 NULL 表示沒有資源分配。
      • 0:資源大小(如果沒有分配資源,則為 0)。
  2. 設備注冊

    • platform_dev_init() 函數中,調用 platform_device_register_simple() 注冊一個平臺設備。如果設備注冊失敗(返回 IS_ERR()),則返回錯誤代碼。
    • 如果設備注冊成功,會輸出日志信息 "Platform device registered successfully"
  3. 設備注銷

    • platform_dev_exit() 函數中,調用 platform_device_unregister() 注銷平臺設備。
    • 注銷設備后,會輸出日志信息 "Platform device unregistered successfully"

編譯與加載

1. 創建 Makefile 文件

在當前目錄下創建一個 Makefile 文件來編譯這個內核模塊:

obj-m += platform_device_example.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
2. 編譯內核模塊

運行以下命令編譯內核模塊:

make

這將生成一個名為 platform_device_example.ko 的內核模塊文件。
在這里插入圖片描述

3. 加載模塊

使用 insmod 命令加載內核模塊:

sudo insmod platform_device_example.ko

成功加載后,你將看到設備成功注冊的日志信息 "Platform device registered successfully"

4. 查看設備

加載模塊后,你可以查看設備是否成功注冊到 /sys 下:

ls /sys/class/platform/my_platform_device
5. 卸載模塊

使用 rmmod 卸載模塊:

sudo rmmod platform_device_example

卸載時,會看到 "Platform device unregistered successfully" 的日志信息。

6. 清理編譯文件

清理編譯文件:

make clean

總結

這個示例演示了如何通過 platform_device_register_simple() 注冊一個平臺設備,并使用 platform_device_unregister() 注銷設備。它通過簡單的內核模塊來注冊和注銷平臺設備,設備的相關信息可以通過 /sys/class/platform/ 目錄查看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86335.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入學習入門--(一)前備知識

一.Python基礎知識 1.1 Python算數運算 1.2 變量 1.3 數據類型 1.3.1 int&#xff08;整數&#xff09; float&#xff08;浮點數&#xff09; str&#xff08;字符串&#xff09; 1.3.2 bool&#xff08;布爾值&#xff09;: 表示真或假 取值:True,False 1.3.3 list&…

iClone 中創建的面部動畫導入 Daz 3D

以下是如何將 iClone 中創建的面部動畫導入 Daz 3D 的簡要指南。簡而言之&#xff0c;您可以通過 FBX&#xff08;使用 3DXchange 或 Character Creator 的導出工具&#xff09;導出 iClone 面部動畫&#xff0c;然后將其導入 Daz Studio 并將變形或骨骼重新映射到 Genesis 角色…

OceanBase向量檢索在貨拉拉的探索和實踐

貨拉拉成立于2013年&#xff0c;成長于粵港澳大灣區&#xff0c;是從事同城跨城貨運、企業版物流服務、搬家、零擔、跑腿、冷運、汽車租售及車后市場服務的互聯網物流商城。截至2024年&#xff0c;貨拉拉在全球擁有1670萬月活用戶和168萬月活司機&#xff0c;業務覆蓋全球11個市…

Flask(五) 表單處理 request.form、WTForms

文章目錄 1. 基本表單處理&#xff0c;使用 request.form&#xff08;輕量&#xff09;示例一創建 HTML 表單處理表單數據 示例二HTML 表單&#xff08;login.html&#xff09;Flask 路由處理表單 2. 使用 Flask-WTF 擴展安裝設置 Secret Key&#xff08;CSRF 防護&#xff09;…

c++虛繼承復習

深入理解C虛繼承&#xff1a;解決菱形繼承問題的利器 在C面向對象編程中&#xff0c;多重繼承是一個強大但容易誤用的特性。今天我們來探討一個特殊的多重繼承形式——虛繼承&#xff08;Virtual Inheritance&#xff09;&#xff0c;它是解決著名的"菱形繼承問題"的…

魔樂社區國產算力應用創新大賽重磅開啟!

當國產算力崛起成為 AI 發展新引擎&#xff0c;你是否渴望用創新方案解鎖無限可能&#xff1f;魔樂社區國產算力應用創新大賽重磅來襲&#xff01;聚焦國產算力前沿&#xff0c;無論你是開發者、研究者&#xff0c;還是技術愛好者&#xff0c;都能在這里一展身手。 現在報名參…

WebView 性能調試與優化全流程:加載速度與渲染性能雙提升

移動端 WebView 頁面通常用于承載復雜的前端應用&#xff0c;尤其是動態加載大量數據或進行高頻率交互時&#xff0c;性能問題尤為突出。用戶常常會遇到頁面加載緩慢、滾動卡頓、甚至是部分內容顯示不完全的情況。在這種情況下&#xff0c;如何優化數據加載與渲染過程&#xff…

51c嵌入式~CAN~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/14016935 一、CAN總線常見信號干擾問題 定位干擾原因 當總線有干擾時&#xff0c;有經驗的工程師能夠迅速定位&#xff0c;但是對于新手來說卻很麻煩。 造成總線干擾的原因有很多&#xff0c;比如通過電磁輻射耦合到通…

【cursor實戰】分析python下并行、串行計算性能

提示語 寫一個Python并行計算、串行計算性能對比的代碼。并行計算要包括多線程和多進程兩種,計算的內容要比較復雜 模型 claude-4-sonnet 生成的代碼 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Python并行計算與串行計算性能對比程序 包含串行…

ubuntu中53端口被占用導致dnsmasq無法使用。已解決。

方案一&#xff1a;修改參數&#xff0c;但不影響使用 編輯配置文件 vim /etc/systemd/resolved.conf將此參數修改為&#xff1a; DNSStubListenerno重啟服務 sudo systemctl daemon-reload sudo systemctl disable systemd-resolved.service方案一&#xff1a;直接禁用 編…

【多模態大模型】訓練與推理直觀解讀

1.直觀案例解讀-圖文問答 假設我們的輸入是一張包含小貓的圖片&#xff0c;以及一個文本提問&#xff1a;“其中是否有小貓&#xff1f;”。下面我將以最詳盡的方式&#xff0c;描述數據在nanoVLM模型中從輸入到輸出的完整流動過程&#xff0c;并解釋每一步中數據的形狀和含義…

uni-app項目實戰筆記17--獲取系統信息getSystemInfo狀態欄和膠囊按鈕

接著上一篇筆記&#xff0c;在添加頭部導航欄后&#xff0c;H5顯示正常&#xff1a; 但在微信小程序中&#xff0c;由于劉海屏的存在&#xff0c;添加的頭部導航欄跟狀態欄重疊在一起&#xff1a; 因此需要獲取狀態欄的高度以便狀態欄和導航欄錯開不重疊在一起。同時頭部導航欄…

Windows下Zookeeper客戶端啟動緩慢問題分析與解決方案

文章目錄 1. 問題描述2. 問題分析2.1 性能分析2.2 根本原因 3. 解決方案3.1 臨時解決方案3.2 長期解決方案 4. 注意事項5. 結論 1. 問題描述 在Windows 8.1 64-bit操作系統環境下&#xff0c;使用Curator框架連接Zookeeper時出現客戶端啟動異常緩慢的問題。具體表現為&#xf…

在 Java 中生成 PDF 縮略圖(教程)

Java 本身無法自動生成 PDF 頁面縮略圖&#xff0c;但幸運的是&#xff0c;有許多軟件庫可以實現這一功能。本文示例使用我們自家的 JPedal 庫&#xff0c;僅需幾行 Java 代碼即可創建縮略圖。JPedal 是開發者使用的最佳 Java PDF 庫。 如何使用 JPedal 將 PDF 轉換為縮略圖 …

基于大模型的甲狀腺結節預測及綜合診療技術方案大綱

目錄 一、技術方案概述二、術前預測與方案制定2.1 結節特征分析與良惡性預測2.2 手術方案建議2.3 麻醉方案優化三、術中輔助決策3.1 實時數據監測與分析3.2 麻醉深度監控與調節四、術后護理與并發癥預測4.1 術后恢復預測4.2 并發癥風險預警五、統計分析與技術驗證5.1 數據分割與…

SpringCloud系列(36)--SpringCloud Gateway簡介

1、SpringCloud GateWay概述 SpringCloud Gateway是 Spring Cloud的一個全新項目&#xff0c;基于Spring 5.0Spring Boot 2.0和Project Reactor等技術開發的網關&#xff0c;它旨在為微服務架構提供一種簡單有效的統—的API路由管理方式&#xff1b;SpringCloud Gateway作為Sp…

TensorFlow深度學習實戰:構建神經網絡全指南

引言&#xff1a;深度學習與TensorFlow概覽 深度學習作為機器學習的一個重要分支&#xff0c;近年來在計算機視覺、自然語言處理、語音識別等領域取得了突破性進展。TensorFlow是由Google Brain團隊開發的開源深度學習框架&#xff0c;自2015年發布以來&#xff0c;已成為最受…

K8S: etcdserver: too many requests

Kubernetes etcdserver: too many requests 錯誤解決方案 當Kubernetes集群出現 etcdserver: too many requests 錯誤時&#xff0c;表明etcd數據庫接收到的請求量超過了其處理能力。etcd作為Kubernetes的核心組件&#xff0c;存儲著集群的所有狀態數據&#xff0c;處理請求過…

銀河麒麟高級服務器操作系統(全架構)OpenGauss 數據庫部署手冊

一、部署前準備工作 1. 環境檢查 項目配置描述內存功能調試建議 32GB 以上。性能測試和商業部署時&#xff0c;單實例部署建議 128GB 以上。復雜的查詢對內存的需求量比較高&#xff0c;在高并發場景下&#xff0c;可能出現內存不足。此時建議使用大內存的機器&#xff0c;或…

Boosting:從理論到實踐——集成學習中的偏差征服者

核心定位&#xff1a;一種通過串行訓練弱學習器、自適應調整數據權重&#xff0c;將多個弱模型組合成強模型的集成學習框架&#xff0c;專注于降低預測偏差。 本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千A…