娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

Linux-3.0.8中基于S5PV210的GPIO模塊代碼追蹤和分析

發布者:JoyousJourney最新更新時間:2024-12-27 來源: cnblogs關鍵字:S5PV210 手機看文章 掃描二維碼
隨時隨地手機看文章

編寫按鍵驅動時,想知道內核是如何管理GPIO的,所以開始追蹤代碼,中間走了一些彎路,現記錄于此。


追蹤代碼之前,我猜測:第一,這部分代碼應該在系統set up階段執行;第二,GPIO的代碼應該在machine或者platform或者vendor相關的目錄下。事實證明,第一點是正確的,第二點基本是錯誤的,因為內核依靠對GPIO的抽象來管理之,這層抽象層給具體的machine留出了一些它們需要是實現的接口,這與其他的設備驅動框架在使用上是很類似的,當然,GPIO也是一種設備啊... ...所以,管理GPIO的多數代碼位于drivers/gpio/目錄下。


好了,開始走讀代碼,那么對于S5PV210這塊SoC,GPIO子系統的入口函數在哪里呢?在drivers/gpio/gpio-s5pv210.c中,入口函數的實現如下圖所示:


 1 static __init int s5pv210_gpiolib_init(void)

 2 {

 3     struct s3c_gpio_chip *chip = s5pv210_gpio_4bit;

 4     int nr_chips = ARRAY_SIZE(s5pv210_gpio_4bit);

 5     int gpioint_group = 0;

 6     int i = 0;

 7 

 8     for (i = 0; i < nr_chips; i++, chip++) {

 9         if (chip->config == NULL) {

10             chip->config = &gpio_cfg;

11             chip->group = gpioint_group++;

12         }

13         if (chip->base == NULL)

14             chip->base = S5PV210_BANK_BASE(i);

15     }

16 

17     samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit, nr_chips);

18     s5p_register_gpioint_bank(IRQ_GPIOINT, 0, S5P_GPIOINT_GROUP_MAXNR);

19 

20     return 0;

21 }

22 core_initcall(s5pv210_gpiolib_init);


入口函數沒幾行代碼,但是下面所有的內容都要從它開始,所以一點一點來吧,這里先羅列一下下面要敘述的內容:


1. struct s3c_gpio_chip的內容,以及重要的數組s5pv210_gpio_4bit;


2. 上述結構體中的成員config和base;


3. samsung_gpiolib_add_4bit_chips()的分析,這部分比較長。


第一部分,struct s3c_gpio_chip的介紹以及重要的數組s5pv210_gpio_4bit


 1 struct s3c_gpio_chip {

 2     struct gpio_chip    chip;

 3     struct s3c_gpio_cfg    *config;

 4     struct s3c_gpio_pm    *pm;

 5     void __iomem        *base;

 6     int            irq_base;

 7     int            group;

 8     spinlock_t         lock;

 9 #ifdef CONFIG_PM

10     u32            pm_save[4];

11 #endif

12 };


  從面向對象的角度來看,s3c_gpio_chip是gpio_chip的子類,但是又新增了一些新的屬性和操作。雖說它的名字是chip,但是一個s3c_gpio_chip描述的是一個GPIO bank,如GPA0、GPA1、GPB等等, 這一點在接著要介紹的數組s5pv210_gpio_4bit中得以清晰體現。


  base成員表示的是當前bank的控制寄存器的起始虛擬地址,注意是虛擬地址。


  pm_save[]用于功耗管理,進入低功耗模式之前將相關寄存器的值存到該數組中,退出低功耗模式時將該數組的內容回寫到各寄存器中。


  config成員的類型是struct s3c_gpio_cfg,具體的結構是:


 1 struct s3c_gpio_cfg {

 2     unsigned int    cfg_eint;

 3 

 4     s3c_gpio_pull_t    (*get_pull)(struct s3c_gpio_chip *chip, unsigned offs);

 5     int        (*set_pull)(struct s3c_gpio_chip *chip, unsigned offs,

 6                     s3c_gpio_pull_t pull);

 7 

 8     unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs);

 9     int     (*set_config)(struct s3c_gpio_chip *chip, unsigned offs,

10                    unsigned config);

11 };


可見config成員用于控制和查看當前bank的某個pin的上下拉電阻的狀態,以及設置和查看某引腳上的復用功能,這個成員作為子類struct s3c_gpio_cfg的新成員,說明以上這兩種功能在不同的machine以及GPIO IP上的差別是不能忽略的。


struct s3c_gpio_cfg中很重要的一個成員就是它的父類struct gpio_chip,它內容很多,不過看成員名字就基本能明白含義:


 1 struct gpio_chip {

 2     const char        *label;

 3     struct device        *dev;

 4     struct module        *owner;

 5 

 6     int            (*request)(struct gpio_chip *chip,

 7                         unsigned offset);

 8     void            (*free)(struct gpio_chip *chip,

 9                         unsigned offset);

10 

11     int            (*direction_input)(struct gpio_chip *chip,

12                         unsigned offset);

13     int            (*get)(struct gpio_chip *chip,

14                         unsigned offset);

15     int            (*direction_output)(struct gpio_chip *chip,

16                         unsigned offset, int value);

17     int            (*set_debounce)(struct gpio_chip *chip,

18                         unsigned offset, unsigned debounce);

19 

20     void            (*set)(struct gpio_chip *chip,

21                         unsigned offset, int value);

22 

23     int            (*to_irq)(struct gpio_chip *chip,

24                         unsigned offset);

25 

26     void            (*dbg_show)(struct seq_file *s,

27                         struct gpio_chip *chip);

28     int            base;

29     u16            ngpio;

30     const char        *const *names;

31     unsigned        can_sleep:1;

32     unsigned        exported:1;

33 

34 #if defined(CONFIG_OF_GPIO)

35     /*

36      * If CONFIG_OF is enabled, then all GPIO controllers described in the

37      * device tree automatically may have an OF translation

38      */

39     struct device_node *of_node;

40     int of_gpio_n_cells;

41     int (*of_xlate)(struct gpio_chip *gc, struct device_node *np,

42                 const void *gpio_spec, u32 *flags);

43 #endif

44 };


這個結構體中的request free等函數指針與gpio的request、free、direction_input、direction_output等函數的實現有關系。


接著看一下數組s5pv210_gpio_4bit,首先,這個名字中包含4bit,意思是每個bank的gpio控制寄存器中,每4bit控制一個gpio pin。這個數組很長,我們只取出個別元素看一下:


 1 static struct s3c_gpio_chip s5pv210_gpio_4bit[] = {

 2     {

 3         .chip    = {

 4             .base    = S5PV210_GPA0(0),

 5             .ngpio    = S5PV210_GPIO_A0_NR,

 6             .label    = 'GPA0',

 7         },

 8     }, {

 9         .chip    = {

10             .base    = S5PV210_GPA1(0),

11             .ngpio    = S5PV210_GPIO_A1_NR,

12             .label    = 'GPA1',

13         },

14     }, {

15         .chip    = {

16             .base    = S5PV210_GPB(0),

17             .ngpio    = S5PV210_GPIO_B_NR,

18             .label    = 'GPB',

19         },

20     },

21 ... ... ... ... ... ... ... ... 

22 {

23         .base    = (S5P_VA_GPIO + 0xC40),

24         .config    = &gpio_cfg_noint,

25         .irq_base = IRQ_EINT(16),

26         .chip    = {

27             .base    = S5PV210_GPH2(0),

28             .ngpio    = S5PV210_GPIO_H2_NR,

29             .label    = 'GPH2',

30             .to_irq = samsung_gpiolib_to_irq,

31         },

32     }, {

33         .base    = (S5P_VA_GPIO + 0xC60),

34         .config    = &gpio_cfg_noint,

35         .irq_base = IRQ_EINT(24),

36         .chip    = {

37             .base    = S5PV210_GPH3(0),

38             .ngpio    = S5PV210_GPIO_H3_NR,

39             .label    = 'GPH3',

40             .to_irq = samsung_gpiolib_to_irq,

41         },

42     },

43 };


這個數組描述了一些S5PV210上的gpio,但是對比數據手冊,有一些gpio并沒有出現在這里,但是這已經足夠多了,可以說這個數組描述了系統中多數能夠使用的gpio,并初始化了一些信息,比如當前bank的第一個pin的編號、這個bank中所有pin的數量等等,這些都是宏定義,具體的需要看mach-s5pv210相關的頭文件,由于涉及到的宏太多,而且沒什么難度,這里就不記錄了。


第二部分,struct s3c_gpio_chip中的config成員和base成員初始化。


這一部分的處理在s5pv210_gpiolib_init函數中,可以看到s5pv210_gpio_4bit中很多元素的config成員沒有初始化,也就是NULL,那么這里就需要給其賦值為gpio_cfg,這個變量就在當前文件中,定義如下:


1 static struct s3c_gpio_cfg gpio_cfg = {

2     .set_config    = s3c_gpio_setcfg_s3c64xx_4bit,

[1] [2] [3]
關鍵字:S5PV210 引用地址:Linux-3.0.8中基于S5PV210的GPIO模塊代碼追蹤和分析

上一篇:九鼎S5PV210開發板的SD卡啟動、uboot tftp升級內核鏡像
下一篇:UT-S5PV210開發板調通3G—WCDMA模塊

推薦閱讀最新更新時間:2025-05-02 11:58

S5PV210 啟動流程
S3C6410啟動流程 首先,看一下S3C6410啟動流程 ① iROM supports initial boot up : initialize system clock, D-TCM, device specific controller and booting device. ② iROM boot codes can load 4KB of bootloader to stepping stone. The 8KB boot loader is called BL1. ③ BL1: BL1 can initialize system clock, UART, and SDRAM for user. After ini
[單片機]
<font color='red'>S5PV210</font> 啟動流程
S5PV210 nand 4bit ecc筆記與AM335x的ECC
首先假設flash芯片頁大小為2K + 64B的格式。 S5PV210 根據User Manual的4.3.7 4-BIT ECC PROGRAMMING GUIDE (ENCODING) 得知4bitecc的編碼步驟為: 1. 寫數據之前,設置Msglength(NCONF【25】)設為512,InitMECC(NFCONT )為1,MainECCLock (NFCONT ) 清零,解鎖ECC; 2. 寫數據時,每寫512B, NFMECC0 and NFMECC1產生ECC code(7字節),當寫完一頁數據(我的nand頁大小為2K)時,將ECC寫入OOB(28字節)。 解碼: 讀 懶得寫了,自己看代碼吧,和8bit ecc
[單片機]
S5PV210地址尋址能力映射
1.S5PV210是32位SoC,尋址能力為4G,0x0000 0000~0xFFFF FFFF。 DRAM地址為0x1FFF FFFF~0x5FFF FFFF,即只支持外掛1G內存。 映射如下: 2.下圖是iROM和SRAM的地址映射
[單片機]
<font color='red'>S5PV210</font>地址尋址能力映射
s5pv210中斷體系
一、什么是中斷? 1、中斷的發明是用來解決宏觀上的并行需要的。宏觀就是從整體上來看,并行就是多件事情都完成了。 2、微觀上的并行,就是指的真正的并行,就是精確到每一秒甚至每一刻,多個事情都是在同時進行的。宏觀上面的并行并不等于圍觀的并行,有時候宏觀上是并行的,微觀上 是串行的。 3、為什么需要中斷?因為單核CPU實際無法并行的,但是通過中斷機制,可以實現假并行(宏觀上的并行,微觀上實際還是串行的)。 二、異常和中斷的區別和聯系 1、針對SoC來說,發生復位、軟中斷、中斷、快速中斷、取指令異常、數據異常等,我們都統一叫異常。所以說:中斷其實是異常的一種。 2、異常的定義就是突發事件,打斷了CPU的正常常規業務,CPU不得不跳轉到
[單片機]
英特爾 Panther Lake 處理器 CPU 架構全面更新,被曝包含 4+8+0+4Xe 變體
4 月 28 日消息,X 平臺數據挖掘者 @InstLatX64 注意到,本月 12 日提交到 intel / perfmon 性能監控工具 GitHub 代碼庫的更新正式確認,英特爾 Panther Lake (PTL) 的 CPU 性能核與能效核代號分別是 Cougar Cove 和 Darkmont 。 英特爾目前的酷睿 Ultra 200 系列 Lunar Lake 和 Arrow Lake 處理器主要采用的是 Lion Cove 性能核(P 核)和 Skymont 能效核(E 核),換句話說今年底推出的 Panther Lake 將更新 CPU 微架構。 除 CPU 部分外, Panther Lake 也將首度導入
[嵌入式]
移植u-boot-2010.03問題 --- raise: Signal # 8 caught
再次這里給自己強調一下,網上其他解決這個問題的是基于u-boot其他版本,自己在試用了其他方法之后均未能解決這個問題,可能是由于代碼不一樣,因此需要解決這個問題時,改動的代碼當然也不一樣。這里先按照這位朋友的方法解決,日后如果有能力,再回來補充這篇文章。 方法是:找到u-boot-2010.03/cpu/arm1176/s3c64xx/下的time.c文件。 ulong get_timer_masked(void) { unsigned long long res = get_ticks(); //do_div (res, (timer_load_val / (100 * CONFIG_SYS_HZ))); r
[單片機]
Part8-不用內存怎么行_2440內存初始化lesson2
1、2440地址空間 先去找PCB原理圖,看CPU引出的內存地址線和數據線的寬度。 說明內存的其實地址是0x30000000為起始地址。 初始化內存其實是去初始化存儲器控制器,只有初始化好這個存儲器控制器之后才能訪問相應的芯片。 2、內存芯片的硬件連接 3、存儲控制器 打開芯片手冊,找到存儲器控制器章節, 該寄存器分成了8個組,用于設置總線寬度和等待狀態的寄存器,有8個組可控制8個BANK。 因為BANK7和BANK6用于接SDRAM的,因為原理圖沒有使用UB/LB,所以ST7位選擇為0,WS7等待狀態設置為0,DW7用于設置總線寬度,選擇10為32位。BANK6的值與BANK的設置一樣。 其他BANK不用保持默
[單片機]
Part<font color='red'>8</font>-不用內存怎么行_2440內存初始化lesson2
乘聯會:8月新能源車國內零售滲透率53.9%
根據乘聯會數據,8月全國狹義乘用車零售190.5萬輛,同比下降1.0%,環比增長10.8%;今年以來累計零售1,347.2萬輛,同比增長1.9%。其中8月常規燃油車零售87萬輛,同比下降28%,環比增長4%;1-8月常規燃油車零售744萬輛,同比下降15%。8月國內新能源車零售滲透率53.9%。 隨著新能源車市能源結構變化,滲透率第二個月突破50%,整體車市季節走勢與傳統燃油車季節走勢逐漸出現分化,8月新能源車市熱度攀升,繼續延續下半年持續走強的趨勢。 乘聯會指出8月乘用車市場的特征包括以下五點: 一、8月新能源零售環比7月增速17%是近期較強的,體現國家報廢更新政策的良好市場反饋; 二、新能源車國內零售滲透率達到54%,較2
[嵌入式]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 铁力市| 垫江县| 电白县| 锡林浩特市| 乌兰察布市| 望奎县| 和田县| 准格尔旗| 麻栗坡县| 龙游县| 昌都县| 长武县| 新化县| 从江县| 松原市| 泗洪县| 勐海县| 仁布县| 昂仁县| 楚雄市| 邻水| 澄城县| 万山特区| 罗江县| 基隆市| 怀远县| 菏泽市| 南江县| 衡东县| 铅山县| 安陆市| 衡阳市| 柳州市| 清远市| 龙州县| 金堂县| 肥东县| 澳门| 晋城| 仪征市| 东乌珠穆沁旗|