Q0: Driver 開發方式為何?
Ans:
請參考"Linux Driver開發的模式" https://blog.ittraining.com.tw/2024/02/linux.html
Q1: 在Linux 驅動程式-> Linux GPIO host control 的bcm2708_gpio.c 是在哪個路徑下?
Ans: 課程使用的是kernel 4.4.x , 其關於bcm2708_gpio.c 改為 driver_gpio.c
路徑位於 /home/pi/linux-raspberrypi-kernel_1.20190401-1/drivers/bcma
Q2: 為何在範例"LinuxDriver_Data_20191001 \Code\14-GPIO-RPI_H\gpio.c"裡
只有定義
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ittraining.com.tw");
MODULE_DESCRIPTION("A Simple GPIO Device Driver module for RaspPi");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ittraining.com.tw");
MODULE_DESCRIPTION("A Simple GPIO Device Driver module for RaspPi");
而沒有定義
module_init();
module_exit();
Ans:
int init_module(void)
void cleanup_module(void)
若想要換別的名字,可以用以下巨集代換成別的名字.
module_init(led_init_module);
module_exit(led_remove_module);
Q3: 02_BTN_LED 裡的local_irq_save(flags), 禁止的irq是button_irq, 對嗎?
Ans: 不是.
/*the critical section of code*/
.
local_irq_restore(flags) //還原被中斷前的CPU狀態
[ 10.391505] Under-voltage detected! (0x00050005)
[ 14.561447] Voltage normalised (0x00000000)
local_irq_restore(flags) //還原被中斷前的CPU狀態
Q4: Raspberry Pi 開發板接上電源後(I/O板接電腦USB埠, 主板接USB電源), 開機訊息或是下dmesg會常出現以下:
[ 10.391505] Under-voltage detected! (0x00050005)
[ 14.561447] Voltage normalised (0x00000000)
這個local arm周邊的 具體是甚麼樣的周邊 請舉例
這些周邊也接到GPU的中段控制器裡嗎?
另外, 中斷控制器有沒有在GPU裡?
bcm2835 GPU ARM內部的IP簡圖去哪查?
Ans:
Ans:
(1) 來自ARM內部本身的中斷, 主要就是ARM 內部timer和作為和GPU溝通界面(Mailbox)的中斷通知
(2) 不知道,但也不用管GPU內部的中斷控制器
(3) 沒有, 我們講的中斷控制器是用來通知ARM 而己
(4) Hardware architecture: GPU ----> Interrupt controller ---> ARM
暫存器的確有可能因為中斷而改變狀態,但不懂得是明明已經說是存取暫存器
並不是一般放在記憶體的變數, 根本沒所謂保存在記憶體裡阿
(2) 不知道,但也不用管GPU內部的中斷控制器
(3) 沒有, 我們講的中斷控制器是用來通知ARM 而己
(4) Hardware architecture: GPU ----> Interrupt controller ---> ARM
資料來源: BCM2835-ARM-Peripherals Ch7 Interrupts
Q5: 如何自己編譯核心或準備本機開發模式
請參閱 "Quick guide for building Raspberry Pi kernel 4.4.x"
Q6:
並不是一般放在記憶體的變數, 根本沒所謂保存在記憶體裡阿
上面這段描述是不是錯的? 我看gpio dirver也沒有加所以volatile?
Ans:
(1) 現在計算機架構採用Memory-mapped I/O , 將Peripheral Register (Special Function Register)也映射在記憶體的一個區段, 所以存取週邊亦等同於存取記憶體.
(2)也許 readl 函式宣告像這樣. readl (volatile uint32_t* paddr)
Ans: