|
07 01 |
Linux porting on different platform HowTo(3)作者: Joey 日期: 2008-07-01 17:32 |
QT2410的timer一共四組,我這邊先略過timer詳細的操作步驟,相關資料在網路上都可以找得到,而timer範例程式碼可參考我之前寫的qt2410 bootloader
打開arch/arm/mach-qt2410/time2410.c,可看到如下程式碼
qt2410_time_init就是qt2410 timer初始化的程式碼擺放位置,而gettimeoffset是kernel提供給各個architecture要自訂的API
瞭解架構後就來塞程式碼吧,首先是initial的部份,initial要做三件事
(1)初始化timer0(我用timer0當系統時鐘,最小tick count 1us)
(2)註冊timer中斷(增加kernel tick count)
(3)開啟timer中斷
詳細程式碼如下所示
而timer的中斷函式與註冊程式碼如下所示
至於gettimeoffset就參考4510的寫法,不需要大改
寫完之後,就可以試著用ICE去load vmlinux並執行,看看timer是否能正確處理timer interrupt
下圖是用ICE在timer interrupt設中斷的情況
打開arch/arm/mach-qt2410/time2410.c,可看到如下程式碼
- struct sys_timer qt2410_timer = {
- .init = qt2410_time_init,
- .offset = qt2410_gettimeoffset,
- };
qt2410_time_init就是qt2410 timer初始化的程式碼擺放位置,而gettimeoffset是kernel提供給各個architecture要自訂的API
瞭解架構後就來塞程式碼吧,首先是initial的部份,initial要做三件事
(1)初始化timer0(我用timer0當系統時鐘,最小tick count 1us)
(2)註冊timer中斷(增加kernel tick count)
(3)開啟timer中斷
詳細程式碼如下所示
- void __init qt2410_time_init (void)
- {
- unsigned long temp;
- qt2410_timer_irq.handler = qt2410_timer_interrupt;
- setup_irq(nTIMER0_INT, &qt2410_timer_irq);
- temp=__raw_readl(rTCFG0);
- temp|=249;
- __raw_writel(temp,rTCFG0);
- temp=__raw_readl(rTCFG1);
- temp|=0x03;
- __raw_writel(temp,rTCFG1);
- __raw_writel(12,rTCNTB0);
- temp=__raw_readl(rTCON);
- temp|=(1<<1);
- __raw_writel(temp,rTCON);
- temp=__raw_readl(rTCON);
- temp&=~(1<<1);
- __raw_writel(temp,rTCON);
- temp=__raw_readl(rTCON);
- temp|=0x9;
- __raw_writel(temp,rTCON);
- INT_ENABLE(nTIMER0_INT);
- }
而timer的中斷函式與註冊程式碼如下所示
- static irqreturn_t qt2410_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
- {
- //timer_cnt++;
- write_seqlock(&xtime_lock);
- timer_tick(regs);
- write_sequnlock(&xtime_lock);
- return IRQ_HANDLED;
- }
- static struct irqaction qt2410_timer_irq =
- {
- .name = "QT2410 Timer Tick",
- .flags = SA_INTERRUPT | SA_TIMER,
- .handler = qt2410_timer_interrupt
- };
至於gettimeoffset就參考4510的寫法,不需要大改
寫完之後,就可以試著用ICE去load vmlinux並執行,看看timer是否能正確處理timer interrupt
下圖是用ICE在timer interrupt設中斷的情況
評論: 0 |
引用: 0 |
閱讀: 1806
發表評論
訂閱
上一篇
返回
下一篇
標籤:


fw_printenv-control u-boot enviroment variables under linux (2009-05-12 16:35)
rpcapd與netcat-測試嵌入式系統的好工具 (2009-04-09 17:06)
udev-強大的device node管理系統 (2009-02-02 20:35)
Framebuffer兩三事-Test On QT2410 (2009-01-12 16:29)
UIO-Linux user space I/O driver (2008-12-15 14:50)
GDB-刺入bug心臟的寶劍 (2008-10-15 16:11)
Telnet daemon-RS232以外的選擇 (2008-10-03 18:57)
在嵌入式系統切換file system-以squashfs和jffs2為例 (2008-10-01 19:44)
Linux kernel module-進入系統核心的鑰匙 (2008-09-12 14:03)