樹莓派核心驅動編寫 控制GPIO的輸出

2021-10-16 05:06:34 字數 3937 閱讀 8929

匯流排位址,實體地址,虛擬位址 參考博文:位址概念

樹莓派

1.bcm2835 樹莓派3b cpu型號,是arm-cotexa53架構

2440 2410 cpu型號 是arm9架構

2.樹莓派是32位系統,1g 記憶體,只能識別949m

3.匯流排位址4g,實體地址1g,虛擬位址4g

1.晶元目錄

2.gpio章節

描述

1.特別注意樹莓派是匯流排位址,其他晶元是實體地址.

2.除了功能和輸入輸出控制外,後面還有上公升沿邊緣觸發的暫存器

新增暫存器位址,編寫到函式pin4_init裡

volatile:指令不會因編譯器的優化而省略,直接讀取

gpio偏移量

//定義無符號指標,volatile防止優化

volatile

unsigned

int* gpfsel0 =

null

;volatile

unsigned

int* gpset0 =

null

;volatile

unsigned

int* gpclr0 =

null

;//指標指向虛擬位址,0x3f200000是實體地址,ioremap把物理位址對映成虛擬位址

//ioremap使用參考核心

gpfsel0 =

(volatile

unsigned

int*

)ioremap

(0x3f200000,4

);gpset0 =

(volatile

unsigned

int*

)ioremap

(0x3f20001c,4

);gpclr0 =

(volatile

unsigned

int*

)ioremap

(0x3f200028,4

);

編寫open函式

配置功能暫存器

按位操作:先清零12-14位,在賦值

*gpfsel0 &=~

(6<<12)

;//配置pin4引腳為輸出引腳

*gpfsel0 |=1

<<

12;

編寫write函式

讀取上層write值:在核心中查詢函式:copy_from_user,參考核心使用函式 usercmd和上層傳的型別一樣

根據值操作io口:操作第4位

//獲取上層write值

copy_from_user

(&usercmd,buf,count)

;//根據值操作io口

if(usercmd ==1)

else

if(usercmd ==0)

else

解除對映

iounmap

(gpfsel0)

;//先解除虛擬位址對映,在銷毀裝置

iounmap

(gpset0)

;iounmap

(gpclr0)

;

完整**

#include

#include

#include

#include

#include

#include

#include

volatile

unsigned

int* gpfsel0 =

null

;volatile

unsigned

int* gpset0 =

null

;volatile

unsigned

int* gpclr0 =

null

;static

struct class *pin4_class;

static

struct device *pin4_class_dev;

static dev_t devno;

static

int major =

231;

static

int minor =0;

static

char

*module_name =

"pin4"

;static ssize_t pin4_write

(struct file *file,

const

char __user *buf, size_t count, loff_t *ppos)

else

if(usercmd ==0)

else

return0;

}static ssize_t pin4_read

(struct file *file,

char __user *buf, size_t count, loff_t *ppos)

static

intpin4_open

(struct inode * inode,

struct file * filp)

//在核心原始碼查詢struct file_operations看結構體成員,新增用到的函式

static

const

struct file_operations pin4_fops =

;static

int __init pin4_init

(void

)//驅動入口

static

void __exit pin4_exit

(void

)module_init

(pin4_init)

;//入口,是個巨集

module_exit

(pin4_exit)

;module_license

("gpl v2"

);

#include

#include

#include

#include

#include

intmain()

else

printf

("input commnd :1/0 \n1:set pin4 high \n0:set pin4 low\n");

scanf

("%d"

,&cmd);if

(cmd ==1)

else

printf

("data = %d\n"

,data)

;write

(fd,

&data,1)

;close

(fd)

;return0;

}

1』編譯參考博文:樹莓派核心驅動編寫——新增與呼叫

2.執行上層,檢視gpio輸出

檢視gpio:gpio readall

師承上官可程式設計 —— 陳立臣

樹莓派核心驅動編寫 新增與呼叫

各種裝置以檔案的形式存放在 dev目錄,稱裝置檔案。主裝置號,次裝置號 主裝置號 不同的裝置 硬碟,led 次裝置號 同一類的多個裝置 led1,led2 管理所有裝置的驅動 1.新增 驅動插入鍊錶順序由裝置號檢索 編寫驅動,載入到核心 裝置名,裝置號,裝置驅動函式 操作暫存器來驅動i o 2.查詢...

樹莓派GPIO控制 python篇

樹莓派的軟體擴充套件庫雖然很多,但也導致了擴充套件庫 碎片化 的問題,例如操作樹莓派的gpio埠,gpio的編號便存在三種不同的方式。插座編號方式 編號側重p1插座側,從上到下,從左到右。正如圖3的header一欄。bcm2835編號方式 編號側重cpu暫存器,根據bcm2835的gpio暫存器編號...

Linux學習 樹莓派gpio控制

編寫使用者程式實現對raspberry pi的gpio口輸出高 低電平,讓接在gpio口上的發光二極體閃爍。熟悉linux系統裝置驅動程式框架 wiringpi 是應用於樹莓派平台的 gpio 控制庫函式,wiringpi 遵守 gun lv3。wiringpi 使用 c 或者 c 開發並且可以被其...