匯流排位址,實體地址,虛擬位址 參考博文:位址概念
樹莓派
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 開發並且可以被其...