mini2440的时钟
生活随笔
收集整理的這篇文章主要介紹了
mini2440的时钟
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
mini2440上為了降低電磁干擾配備了12MHz的晶振,如果直接給當(dāng)做cpu的時(shí)鐘,那這個(gè)s3c2440a就屈才了。幸好cpu內(nèi)部自帶了MPLL將晶振時(shí)鐘倍頻使得cpu工作在FCLk及AHB總線上的外設(shè)工作在HCLK和APB總線上的外設(shè)工作在PCLK。當(dāng)然還配有一個(gè)UPLL來產(chǎn)生恒定的48MHZ以支持usb2.0.
①.時(shí)鐘源選擇
在系統(tǒng)復(fù)位時(shí)檢測(cè)引腳OM3:OM2,若是0:0,則主時(shí)鐘源選擇外部晶振,usb時(shí)鐘源選擇外部晶振
②.MPLLCON? main pll control? 主時(shí)鐘寄存器控制
用于設(shè)定FCLK和Fin的倍數(shù)。
Mpll(FCLK) = ( 2 × m × Fin ) / ( p × 2^s )
其中m=MDIV+8, p=PDIV+2, s=SDIV,Fin晶振頻率
比如
Fin=12MHz
MDIV=0x7F=127,m=135
PDIV=2,p=4
SDIV=1,s=1
則FCLK=405MHz
注意:系統(tǒng)復(fù)位時(shí),必須寫一次MPLLCON?? UPLLCON?,這樣系統(tǒng)才能正常工作。即使不改變其值,即使復(fù)位后MPLL UPLL都是使能的,也要寫一次,另外還有如下? ?
③.CLKDIVN clock divider control 時(shí)鐘分頻控制寄存器?
用于設(shè)置 FCLK? HCLK PCLK三者的比例
而CAMDIVN如下
比如
CAMDIVN[8]=0
CAMDIVN[9]=0
HDIVN=2,則HCLK=FCLK / 4
PDIVN=1,,則PCLK=HCLK / 2
有以下示例,摘自嵌入式linux開發(fā)完全手冊(cè)
?
/*********************************************************************************************************************************/
2011-12-18
2440的片內(nèi)外設(shè)時(shí)鐘使能控制
linux下將各個(gè)片內(nèi)外設(shè)時(shí)鐘統(tǒng)一管理,組成時(shí)鐘隊(duì)列。
arch/arm/plat-s3c24xx/s3c2410-clock.c
/* standard clock definitions */static struct clk init_clocks_disable[] = {{.name = "nand",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_NAND,}, {.name = "sdi",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_SDI,}, {.name = "adc",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_ADC,}, {.name = "i2c",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_IIC,}, {.name = "iis",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_IIS,}, {.name = "spi",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_SPI,} };static struct clk init_clocks[] = {{.name = "lcd",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_LCDC,}, {.name = "gpio",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_GPIO,}, {.name = "usb-host",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_USBH,}, {.name = "usb-device",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_USBD,}, {.name = "timers",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_PWMT,}, {.name = "uart",.id = 0,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_UART0,}, {.name = "uart",.id = 1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_UART1,}, {.name = "uart",.id = 2,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_UART2,}, {.name = "rtc",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_RTC,}, {.name = "watchdog",.id = -1,.parent = &clk_p,.ctrlbit = 0,}, {.name = "usb-bus-host",.id = -1,.parent = &clk_usb_bus,}, {.name = "usb-bus-gadget",.id = -1,.parent = &clk_usb_bus,}, };
//在需要操作各個(gè)外設(shè)的時(shí)鐘時(shí),就調(diào)用用內(nèi)核提供的各個(gè)函數(shù)即可。如摘自mini2440_adc.c static struct clk *adc_clock; adc_clock = clk_get(NULL, "adc");//獲取時(shí)鐘 if (!adc_clock) { printk(KERN_ERR "failed to get adc clock source\n"); return -ENOENT; } clk_enable(adc_clock);//使能時(shí)鐘//在不需要時(shí),禁止掉 if (adc_clock) { clk_disable(adc_clock);//禁止時(shí)鐘 clk_put(adc_clock); adc_clock = NULL;//源碼下是一個(gè)空操作,可能是預(yù)留 } 此文的adc不錯(cuò)哦,記一下網(wǎng)址
http://www.cnblogs.com/hanyan225/archive/2011/03/29/1998667.html
①.時(shí)鐘源選擇
在系統(tǒng)復(fù)位時(shí)檢測(cè)引腳OM3:OM2,若是0:0,則主時(shí)鐘源選擇外部晶振,usb時(shí)鐘源選擇外部晶振
②.MPLLCON? main pll control? 主時(shí)鐘寄存器控制
用于設(shè)定FCLK和Fin的倍數(shù)。
Mpll(FCLK) = ( 2 × m × Fin ) / ( p × 2^s )
其中m=MDIV+8, p=PDIV+2, s=SDIV,Fin晶振頻率
比如
Fin=12MHz
MDIV=0x7F=127,m=135
PDIV=2,p=4
SDIV=1,s=1
則FCLK=405MHz
注意:系統(tǒng)復(fù)位時(shí),必須寫一次MPLLCON?? UPLLCON?,這樣系統(tǒng)才能正常工作。即使不改變其值,即使復(fù)位后MPLL UPLL都是使能的,也要寫一次,另外還有如下? ?
③.CLKDIVN clock divider control 時(shí)鐘分頻控制寄存器?
用于設(shè)置 FCLK? HCLK PCLK三者的比例
而CAMDIVN如下
比如
CAMDIVN[8]=0
CAMDIVN[9]=0
HDIVN=2,則HCLK=FCLK / 4
PDIVN=1,,則PCLK=HCLK / 2
有以下示例,摘自嵌入式linux開發(fā)完全手冊(cè)
?
/*********************************************************************************************************************************/
2011-12-18
2440的片內(nèi)外設(shè)時(shí)鐘使能控制
linux下將各個(gè)片內(nèi)外設(shè)時(shí)鐘統(tǒng)一管理,組成時(shí)鐘隊(duì)列。
arch/arm/plat-s3c24xx/s3c2410-clock.c
/* standard clock definitions */static struct clk init_clocks_disable[] = {{.name = "nand",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_NAND,}, {.name = "sdi",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_SDI,}, {.name = "adc",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_ADC,}, {.name = "i2c",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_IIC,}, {.name = "iis",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_IIS,}, {.name = "spi",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_SPI,} };static struct clk init_clocks[] = {{.name = "lcd",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_LCDC,}, {.name = "gpio",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_GPIO,}, {.name = "usb-host",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_USBH,}, {.name = "usb-device",.id = -1,.parent = &clk_h,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_USBD,}, {.name = "timers",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_PWMT,}, {.name = "uart",.id = 0,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_UART0,}, {.name = "uart",.id = 1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_UART1,}, {.name = "uart",.id = 2,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_UART2,}, {.name = "rtc",.id = -1,.parent = &clk_p,.enable = s3c2410_clkcon_enable,.ctrlbit = S3C2410_CLKCON_RTC,}, {.name = "watchdog",.id = -1,.parent = &clk_p,.ctrlbit = 0,}, {.name = "usb-bus-host",.id = -1,.parent = &clk_usb_bus,}, {.name = "usb-bus-gadget",.id = -1,.parent = &clk_usb_bus,}, };
//在需要操作各個(gè)外設(shè)的時(shí)鐘時(shí),就調(diào)用用內(nèi)核提供的各個(gè)函數(shù)即可。如摘自mini2440_adc.c static struct clk *adc_clock; adc_clock = clk_get(NULL, "adc");//獲取時(shí)鐘 if (!adc_clock) { printk(KERN_ERR "failed to get adc clock source\n"); return -ENOENT; } clk_enable(adc_clock);//使能時(shí)鐘//在不需要時(shí),禁止掉 if (adc_clock) { clk_disable(adc_clock);//禁止時(shí)鐘 clk_put(adc_clock); adc_clock = NULL;//源碼下是一個(gè)空操作,可能是預(yù)留 } 此文的adc不錯(cuò)哦,記一下網(wǎng)址
http://www.cnblogs.com/hanyan225/archive/2011/03/29/1998667.html
轉(zhuǎn)載于:https://www.cnblogs.com/-song/archive/2011/10/21/3331946.html
總結(jié)
以上是生活随笔為你收集整理的mini2440的时钟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么样的人适合做产品经理
- 下一篇: mac 雪豹 10.6 五国