新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C24x0片內設備驅動編寫時的時鐘問題

        S3C24x0片內設備驅動編寫時的時鐘問題

        作者: 時間:2016-11-10 來源:網絡 收藏
        前天編寫S3C24x0芯片的ADC驅動。其實很簡單,參考別人的驅動,把以前的驅動模板改改就好了。可是寫好后沒使用成功。測來測去,最后發現對ADC的寄存器根本無法寫入,只能讀出。郁悶??!一開始以為是我用的賦值語句不對,參考我的驅動學習文檔,試了一圈,問題依舊!郁悶了整整兩天之后,在網上看到有人也遇到了2410的外設寄存器無法賦值的情況,最后發現是時鐘問題。受此啟發,我回想起了以前看的Linux的SPI驅動,里面有以下語句:

        本文引用地址:http://www.104case.com/article/201611/317276.htm

        hw->clk=clk_get(&pdev->dev,"spi");
        if(IS_ERR(hw->clk)){
        dev_err(&pdev->dev,"No clock for devicen");
        err=PTR_ERR(hw->clk);
        gotoerr_no_clk;
        }

        /* for the moment, permanently enable the clock */

        clk_enable(hw->clk);

        當時也沒怎么在意,后悔啊!之后我在DAC驅動上加了類似的語句,參考了別人的2410觸摸屏驅動,將"spi"改為"adc"。實驗成功!

        三星的S3C24x0處理器為了實現低功耗,增加對外設的時鐘和電源的管理。具體的內容請看芯片手冊的《7. Clock & Power Management》這一章。雖然芯片啟動時默認這些外設的時鐘是使能的,但在Linux下,啟動時為了節能考慮,將部分時鐘關閉了。如果沒有使能這些時鐘,就會出現無法對外設寄存器寫操作的情況。Linux中時鐘使能部分的源碼主要有:

        /include/asm-arm/plat-s3c24xx/clock.h
        /include/asm-arm/arch-s3c2410/regs-clock.h
        /arch/arm/mach-s3c2410/clock.c

        參考這些源碼,就可以大致知道Linux是如何操作S3C24x0處理器的外設時鐘的。

        特別是/arch/arm/mach-s3c2410/clock.c中的以下數據對編程有所幫助:

        /* standard clock definitions */

        staticstructclk 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,
        }
        };

        staticstructclk 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,
        },
        };




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 偏关县| 松溪县| 仙桃市| 屏南县| 张掖市| 康定县| 汤原县| 英山县| 朔州市| 宁化县| 阿荣旗| 淮北市| 菏泽市| 贵阳市| 托克逊县| 萝北县| 徐闻县| 比如县| 永福县| 原阳县| 九台市| 阿尔山市| 洛南县| 渝中区| 宜都市| 铁力市| 西贡区| 武陟县| 辽中县| 夏河县| 罗定市| 门源| 河源市| 南投县| 万载县| 封开县| 尼玛县| 大姚县| 威远县| 资中县| 田东县|