1. gzyueqian
      13352868059

      Linux頭文件中s3c2410 GPIO的宏

      更新時(shí)間: 2008-05-10 11:23:48來(lái)源: 粵嵌教育瀏覽量:962

      一、GPIO寄存器定義

      1.#define GPCON(x) __REG2(0x56000000, (x) * 0x10)

        這句是定義2410的GPIO的控制寄存器,注意:__REG2的參數(shù)是寄存器的物理地址,這個(gè)物理地址經(jīng)_REG2宏轉(zhuǎn)換為虛擬地址,對(duì)照2410的手冊(cè)可以得到一下對(duì)應(yīng)關(guān)系:

      GPCON(1) ------ PORT A 0x56000000
      GPCON(2) ------ PORT B 0x56000010
      GPCON(3) ------ PORT C 0x56000020
      ……
      GPCON(8) ------ PORT H 0x56000070

      2.#define GPDAT(x) __REG2(0x56000004, (x) * 0x10)

       這句是定義2410的GPIO的數(shù)據(jù)寄存器,定義方法同GPCON宏。

      GPDAT(1) ------ PORT A 0x56000004
      GPDAT(2) ------ PORT B 0x56000014
      GPDAT(3) ------ PORT C 0x56000024
      ……
      GPDAT(8) ------ PORT H 0x56000074

      3.#define GPUP(x) __REG2(0x56000008, (x) * 0x10)

        這句是定義2410的GPIO的上拉電阻屏蔽/激活寄存器,定義方法同GPCON宏。
      GPUP(1) ------ PORT A 0x56000008
      GPUP(2) ------ PORT B 0x56000018
      GPUP(3) ------ PORT C 0x56000028
      ……
      GPUP(8) ------ PORT H 0x56000078

      二、GPIO端口號(hào)定義
        以GPIO_G12來(lái)說(shuō)明在內(nèi)核頭文件$(KERNEL_INCLUDE)/asm-arm/arch/s3c2410.h中是如何來(lái)定義IO port的端口號(hào)的。定義GPIO端口主要涉及到以下幾個(gè)宏:

        #define MAKE_GPIO_NUM(p, o) ( (p << GPIO_PORT_SHIFTT) | (o << GPIO_OFS_SHIFT))
        #define GPIO_G12 MAKE_GPIO_NUM(PORTG_OFS, 12)

      GPIO_PORT_SHIFTT值為8,代表GPIO組號(hào)在整個(gè)GPIO端口號(hào)(如GPIO_G12)字段中的位移
      GPIO_OFS_SHIFT值為0,代表GPIO組內(nèi)偏移號(hào)在整個(gè)GPIO端口號(hào)(如GPIO_G12)字段中的位移

      s3c2410有117個(gè)多功能input/output port pins。分為以下八組:

      — Port A (GPA): 23-output port #define PORTA_OFS 0
      — Port B (GPB): 11-input/output port #define PORTB_OFS 1
      — Port C (GPC): 16-input/output port #define PORTC_OFS 2
      — Port D (GPD): 16-input/output port #define PORTD_OFS 3
      — Port E (GPE): 16-input/output port #define PORTE_OFS 4
      — Port F (GPF): 8-input/output port #define PORTF_OFS 5
      — Port G (GPG): 16-input/output port #define PORTG_OFS 6
      — Port H (GPH): 11-input/output port #define PORTH_OFS 7

        GPG12屬于G組,組內(nèi)偏移為12,從上述兩個(gè)宏定義中,我們可以很清楚地看出GPIO_G12結(jié)構(gòu):
               
                                 圖1 GPIO端口號(hào)結(jié)構(gòu)圖
        端口一共有8組,從上面的宏定義可以看出,端口組號(hào)p的范圍:0~7。而組內(nèi)偏移各組不盡相同,Port A有23個(gè)輸出口,因此它的組內(nèi)偏移o為0~22,Port G有16個(gè)IO口,它的組內(nèi)偏移o為0~15,其他組的GPIO以此類(lèi)推。

      三、write_gpio_bit(x,v)宏分析
        write_gpio_bit宏傳入兩個(gè)參數(shù),個(gè)為GPIO端口號(hào),如GPIO_G12;第二個(gè)參數(shù)為1或0,為相應(yīng)IO口設(shè)置高電平或低電平輸出。具體宏展開(kāi)如下:


      代碼
      #define write_gpio_bit(x, v)
      ({
      GPDAT(GRAB_PORT((x))) &= ~(0x1 << GRAB_OFS((x)));
      GPDAT(GRAB_PORT((x))) |= ((v) << GRAB_OFS((x)));
      })


      GRAB_PORT宏的參數(shù)是GPIO端口號(hào),功能是從GPIO端口號(hào)中解析出組號(hào),具體定義如下:

      #define GRAB_PORT(x) (((x) & GPIO_PORT_MASK) >> GPIO_PORT_SHIFTT)

      其中GPIO_PORT_MASK是組號(hào)的掩碼,值為0x0000ff00,從圖1中也可看出。

      GRAB_OFS宏和GRAB_PORT類(lèi)似,它的功能是從GPIO端口號(hào)中解析出組內(nèi)偏移:

      #define GRAB_OFS(x) (((x) & GPIO_OFS_MASK) >> GPIO_OFS_SHIFT)

      其中偏移值掩碼GPIO_OFS_MASK=0x000000ff。

        現(xiàn)在我們結(jié)合上述說(shuō)明來(lái)分析write_gpio_bit(GPIO_G12,1)這條語(yǔ)句:由GPIO_G12的宏定義可計(jì)算出其值為0x0000060C,GRAB_PORT(GPIO_G12)解析得到所操作的IO屬于G組,組號(hào)為6;GRAB_OFS(GPIO_G12)解析得到此IO口為G組的第12個(gè)引腳(從0開(kāi)始算起),為GPG12,表達(dá)式值為12。則write_gpio_bit(GPIO_G12,1)等價(jià)于下面兩條語(yǔ)句:

      GPDAT(6) &= ~(0x1<<12); //GPGDAT寄存器第12位清零
      GPDAT(6) | = 1<<12; // 向GPGDAT寄存器第12位寫(xiě)入‘1’

        到此,我們知道了write_gpio_bit(GPIO_G12,1)這條語(yǔ)句是將GPG12這個(gè)引腳拉成高電平。

        四、set_gpio_ctrl(x)宏分析完成了對(duì)write_gpio_bit宏的分析,現(xiàn)在來(lái)看set_gpio_ctrl就很簡(jiǎn)單了!在它的宏展開(kāi)中只多了GRAB_MODE(x)和 GRAB_PULLUP(x)分別表示從參數(shù)x中解析出IO口的模式和使能/屏蔽此端口的上拉電阻。值得注意的是set_gpio_ctrl的參數(shù)x不僅僅表示GPIO端口號(hào),其高16位還帶有模式狀態(tài)和上拉電阻控制信息,參數(shù)x的結(jié)構(gòu)如下圖:
            
                           圖2 set_gpio_ctrl的參數(shù)字段結(jié)構(gòu)圖
        低16位即為前面所述的GPIO的端口號(hào),高16位中的R字段用來(lái)屏蔽/使能IO口的上拉電阻功能。R=0,上拉電阻使能;R=1,上拉電阻失效。M字段用來(lái)設(shè)置IO口的工作模式,M=0,IO口為輸入端口;M=1,IO口為輸出端口;M=2,可選功能1;M=3,可選功能2。

        set_gpio_ctrl宏就是通過(guò)寫(xiě)相應(yīng)GPIO所在組的GPXCON(X為A~H)的相應(yīng)位來(lái)設(shè)置IO口模式(GPACON每一個(gè)位控制一個(gè)IO口,而GPBCON~GPHCON都是兩個(gè)位控制一個(gè)IO口的模式),通過(guò)寫(xiě)GPXUP(X為A~H)來(lái)決定是否啟用上拉電阻。典型的set_gpio_ctrl調(diào)用方式如下:

        set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G12);

      代碼
      #define set_gpio_ctrl(x)
      ({ GPCON(GRAB_PORT((x))) &= ~(0x3 << (GRAB_OFS((x))*2));
      GPCON(GRAB_PORT(x)) |= (GRAB_MODE(x) << (GRAB_OFS((x))*2));
      GPUP(GRAB_PORT((x))) &= ~(1 << GRAB_OFS((x)));
      GPUP(GRAB_PORT((x))) |= (GRAB_PULLUP((x)) << GRAB_OFS((x))); })



        這條語(yǔ)句是將GPG12設(shè)置成輸出模式,并且不使用端口的上拉電阻。

      五、結(jié)束
        以上主要結(jié)合《S3C2410X 32-BIT RISC MICROPROCESSOR USER'S MANUAL》分析了$(LINUX_KERNEL_INCLUDE)/asm-arm/arch/s3c2410.h中所定義的對(duì)2410GPIO進(jìn)行操作的幾個(gè)宏,除了文中提及的幾個(gè)宏,除此還有read_gpio_bit(x)、read_gpio_reg(x) 、write_gpio_reg(x, v)等,實(shí)現(xiàn)方法和上述類(lèi)似,在此不再一一贅述!

      免費(fèi)預(yù)約試聽(tīng)課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲人成欧美中文字幕 | 中文字幕v亚洲日本在电影 亚洲片中文字幕在线看 | 在线观看国产不卡秒播AV | 一级少妇精品久久久久久久 | 亚洲色国产电影在线观看 | 又大又黄又爽在线观看免费视频 |