<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Linux頭文件中s3c2410 GPIO的宏

          Linux頭文件中s3c2410 GPIO的宏

          作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          一、GPIO寄存器定義

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

          本文引用地址:http://www.ex-cimer.com/article/201611/316810.htm

          這句是定義2410的GPIO的控制寄存器,注意:__REG2的參數(shù)是寄存器的物理地址,這個物理地址經(jīng)_REG2轉(zhuǎn)換為虛擬地址,對照2410的手冊可以得到一下對應(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端口號定義
          以GPIO_G12來說明在內(nèi)核頭文件$(KERNEL_INCLUDE)/asm-arm/arch/s3c2410.h中是如何來定義IO port的端口號的。定義GPIO端口主要涉及到以下幾個宏:

          #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組號在整個GPIO端口號(如GPIO_G12)字段中的位移
          GPIO_OFS_SHIFT值為0,代表GPIO組內(nèi)偏移號在整個GPIO端口號(如GPIO_G12)字段中的位移

          s3c2410有117個多功能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,從上述兩個宏定義中,我們可以很清楚地看出GPIO_G12結(jié)構(gòu):

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

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

          代碼
          1. #definewrite_gpio_bit(x,v)
          2. ({
          3. GPDAT(GRAB_PORT((x)))&=~(0x1<
          4. GPDAT(GRAB_PORT((x)))|=((v)<
          5. })


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

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

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

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

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

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

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

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

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

          四、set_gpio_ctrl(x)宏分析完成了對write_gpio_bit宏的分析,現(xiàn)在來看set_gpio_ctrl就很簡單了!在它的宏展開中只多了GRAB_MODE(x)和 GRAB_PULLUP(x)分別表示從參數(shù)x中解析出IO口的模式和使能/屏蔽此端口的上拉電阻。值得注意的是set_gpio_ctrl的參數(shù)x不僅僅表示GPIO端口號,其高16位還帶有模式狀態(tài)和上拉電阻控制信息,參數(shù)x的結(jié)構(gòu)如下圖:

          圖2 set_gpio_ctrl的參數(shù)字段結(jié)構(gòu)圖
          低16位即為前面所述的GPIO的端口號,高16位中的R字段用來屏蔽/使能IO口的上拉電阻功能。R=0,上拉電阻使能;R=1,上拉電阻失效。M字段用來設(shè)置IO口的工作模式,M=0,IO口為輸入端口;M=1,IO口為輸出端口;M=2,可選功能1;M=3,可選功能2。

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

          set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G12);

          代碼
          1. #defineset_gpio_ctrl(x)
          2. ({GPCON(GRAB_PORT((x)))&=~(0x3<<(GRAB_OFS((x))*2));
          3. GPCON(GRAB_PORT(x))|=(GRAB_MODE(x)<<(GRAB_OFS((x))*2));
          4. GPUP(GRAB_PORT((x)))&=~(1<
          5. GPUP(GRAB_PORT((x)))|=(GRAB_PULLUP((x))<

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

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



          關(guān)鍵詞: Linux頭文件s3c2410GPIO

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();