1. 記得先關閉防火牆,設定static ip,以系統管理員模式開啟tftp軟體。
2. JK2410開發版BSP有特定的API可以使用 Ex: set_external_irq( )
3. 重要檔案 : kernel-jk2410/include/asm-arm/arch-s3c2410/irqs.h => 定義外部中斷 (IRQ_EINT4 => S0, IRQ_EINT11 => S6)
4. request_irq為kernel提供的標準API。
5. 測試GPIO前的準備: 先 echo or cat 裝置檔,過程中會去open 裝置檔,之後便可以收到外部中斷(open system call 中必須要implement irq的功能)。
6. make rootfs 兩個Makefile需要修改(/jk2410-make-rootfs , /jk2410-make-rootfs/rootfs/)。
7. 一般習慣一次將多個byte寫入kernel , 而非一次一個byte,減少system time(cpu 中斷 -> system call ->return to user process ) 的花費。
8. 試著設計一些題目(修改外部中斷, 排程機制的on board練習)
9. 練習題: 由ap寫data進driver,buffer滿了之後會讓process 去sleep, 按下S6按鍵之後會印出訊息或撥放音樂。
10. 測試一下當只改變狀態並呼叫schedule()而不將current process 放入wait_queue的系統行為。
11. 開發版的audio system 架構 (由下到上): OSS -> liibmad -> application , AP透過外部程式存取device file (/dev/dsp) 來使用OSS driver 。
12. 進行kernel編譯時 (*) 代表build-in 至 kernel 中, 在開機中會自動產生裝置檔。
13. arnix 提供之layer architechre (由上往下): test.c -> madplay -> libmad -> /dev/dsp -> kernel audio driver (OSS)
14. audio driver 練習題 1:
(a) 實做blocking read 當 ap 執行 read 後 forground process put to sleep
(b) 當按下S6按鈕之後,啟動interrupt handler 將process wake up
(c) 往下執行到外部程式即可撥放音樂
(d) 使用mmap將data register mapping to user space 直接控制LED燈
參考說明: http://www.jollen.org/wiki/MP3_Player
15. 開發版 ip 設定參考: http://hi.baidu.com/lozn/blog/item/411f5caf1a053ffafbed504d.html
16. libmad如何porting到開發版? p.s. 查閱jollen wiki
17. 思考為何在播放音樂時,按下S6還是會執行interrupt handler ? 由於此時應用程式還在執行中尚未結束,此時出現外部中斷系統還是會叫起cdata-gpio的中斷,而該操作並沒有意義,因為forground process 並未sleep 且已被madplay 取代掉了。(以上為猜測)
18. 題目2 LED顯示(1~9) 2進制燈號,http://www.jollen.org/wiki/JK2410_LED
19. 寫ap 為結構化程式設計,可以用流程圖分析function call flow,與driver 必須留意OS狀態不同,寫driver = (ap + OS kernel module)。
20. cdata-gpio.c 當中,若write超過64個字元時,會先啟動timer_function(5秒後執行),將current process put to sleep ,此時可接收外部中斷(目前沒有實作有意義的操作),直到timer_function啟動 -> fail2 -> return to forground (猜測) -> 結束。
21 S3c2410 硬體說明: http://blog.ednchina.com/thinkker/29056/category.aspx
22. LED實驗中,在bootloader中下mw.l 0x56000014 0xbff 1 發現LED1不會亮! (參考25.)
mw.l 0x56000010 0x00154000 1 => LED 會全亮。 l : 4個 byte w: 2個 byte b: 1個byte
23. OS中不允許driver直接存取實體位址 => 使用 led = ioremap(0x56000014,4) 透過led變數 indirect 去存取實體位址。
24. cdata2 write to LED 中的程式可以寫在 init_module()中。
25. LED 功能確實啟動的兩個步驟: (1) 先設定好GPBCON register (0x56000010)指定LED1~LED4與CPU之間的PIN腳為輸出Mode (2) 設定GPBDAT register (0x56000014)指定欲亮的LED,GPBDAT為DATA Register。
26. LED練習題: 寫入4個數字,並假設Buffer 此時已滿,使用kernel timer 每1秒鐘顯示1個數字出來,並將10進制換成2進制輸出於LED上,在timer function 中也會將process wake up。
27. 進階練習: 當按下按鈕一次,LED顯示按了幾次對應的數字。 p.s. 寫ap可以讀取GPIO,紀錄按鍵被按下的次數。
28. 如何將自己的driver整合到kernel當中: http://www.jollen.org/wiki/JK2410_merge_a_new_driver_into_kernel
29. 測試 writel(0x87f,led) 是否也可以使LED全亮?可以!
30. 出現 bug: kernel timer added twice at c000bfffb4 記得檢查是否漏掉初始化kernel timer的步驟!
31. (銜接26.)撰寫 write_led() : 提供依輸入數字並將數字顯示到LED的功能。
led_timer(): 每秒鐘輸出一個數字,在idx為0之後結束計數功能。
32. RAM與I/O MEM差別在於RAM可以存放DATA!
33. 一般ARM/RISC 處理器的記憶體位址配置: 0X30000000~0X34000000 FOR RAM
0X34000000以上 FOR I/O MEM
34. 名詞定義: X86 -> VideoRam RISC -> Framebuffer 兩者所指的是同一個LCD Panel 。
35. 可以藉由設計bootloader 或 driver 來定義好 配置給 framebuffer 的記憶體空間(for JK2410開發版 在RAM區間中,33F00000~34000000 300KB的範圍)。
36. 將圖片檔案放入Framebuffer則能在panel上看到圖片被顯示出來。
37. mw.l 33f00000 0x00ff0000 0x12c00畫紅色於整片panel,0x12c00代表點數,1 pixel為 4個 byte 所以用 mw.l,在driver開發中還是要記得不要直接存取實體記憶體位址。
38. for JK2410開發版panel 320*240*4kB(per pixel) ~= 300KB
39. 一般拿到開發版寫driver的工程師須了解以下資訊:
(1) 中斷處理
(2) I/O MEM (frame buffer)
(3) RAM
40. 試著用小畫家,做一張320*240的圖,開機時用tftp 放到 frame buffer 中(有風險性)。
41. 開啟frame buffer driver 後編譯出現error ,vgacon:290 'PCIMEM_BASE' undeclared (first use in this function) => 已解決安裝 patch即可!
42. 為何kernel 中的frame buffer driver即使不打開也可以work ? 因為在bootloader中已經設定過LCD controller 。
43. 設定bootargs 中mem=60M 使得kernel 不會在開機時再去使用到framebuuffer 的空間了!(初始設定下 frame buffer 的空間會在60~64M之間) ,之後若需要存取frame buffer 的空間則須參考存取I/O Memory的方法來做。
44. Linux system 在開機階段會將 root filesystem壓縮檔放入設定好的memory addr (0x30f00000)當中,解壓縮之後檔案會往後長(addr 0x33f0000)。
45. 編譯file system時,若發生error時,記得先將資料備份好,將jk2410-make-rootfs資料夾整個刪除,若rootfs無法刪除,則重開機後再刪掉即可!
46. request_irq() 應該寫在cdata_open(),還是cdata_init_module()中? 參考網址 : http://www.jollen.org/wiki/Hardware_shared_interrupt_and_software_shared_interrupt
47. (承接43.) 練習題: 在kernel space 利用 ioremap() ,存取frame buffer 在panel 上畫圖,不過正式的driver並不會這樣實作,畫圖的功能一定是由ap發起。
48. 實作mmap system call 讓ap可以存取frame buffer,先前於IPC應用上也有使用到mmap()的功能。
49. 在kernel中fb指標會指向0x30f00000,在user space mapping virtual address 有2個階段: (1) phy addr -> kernel virtual adde (2) kernel virtual addr -> user virtual addr。
50. android 系統也是使用direct framebuffer ,可以在ap層直接存取frame buffer。
51. /dev/fb/0 為kernel 內建的frame buffer driver 內部已實作mmap功能可以直接使用!
52. 不要使用程式語言特性去實作,而要利用OS提供的function去實作功能。
53. 4/2 發現showmmap 測試程式無法開啟 /dev/fb/0!
54. 更新jk2410測試程式: http://code.google.com/p/jk2410-codesuite/source/checkout
55. cdata-0.4的範例,testm.c中的操作會造成 kernel panic 的現象發生!
56. 希望driver在kernel/系統開機的狀況下自動進行註冊,只需在driver/char/中修改Makefile即可。
57. 任何application 存取I/O時,都需要使用mmap這個system call,這個nterface必須由driver寫作者自行實作。
58. 利用svn工具 下載lcd_demo程式,測試lcd driver的功能。
59. 測試程式(在init_module時註冊interrupt handler)會出現kernel panic狀況! http://www.jollen.org/wiki/JK2410_shared_interrupt
60. embedded system (非X86系統)中由於GPIO PIN腳多,故較不實作share IRQ。
61. 期末測驗: (1) cdata_led.c <= buffer 滿了之後會將輸入的數字output出去。 (2) mknod 與 install driver 可以寫入 init.rc中在開機後就自動做好(參考wiki 做法)。
62. 講義(二)p.160 由user space 執行mmap 將 user space 的記憶體空間與kernel space 的page table 做mapping ,結果將user space 的記憶體空間對應至I/O MEM。
63. reserved pages 為MMU無法管理到的記憶體區間。
64. GPIO測試方法: case1:先open裝置檔,再做fork()讓兩個process都會去讀取該裝置檔,觀察driver是否有異常 case2: 針對同一裝置檔執行2次open。
65. User-space driver and process race condiction: http://www.jollen.org/wiki/User-space_driver_and_process_race_condition
沒有留言:
張貼留言