GPIO调用方法的实现流程

GPIO调用方法的实现流程上文中虽然讲述了如何实现IO空间的静态映射方法,但调用s3c_gpio_cfgpin、s3c_gpio_setpull、gpio_direction_output就可以访问IO空间,这又是如何实现的呢?本文就来讲述一下实现过程。回到smdkv210_map_io函数中staticvoid __init smdkv210_map_io(void){   
摘要由CSDN通过智能技术生成

GPIO调用方法的实现流程

上文中<IO空间的静态映射基本过程>虽然讲述了如何实现IO空间的静态映射方法,但调用s3c_gpio_cfgpin、s3c_gpio_setpull、gpio_direction_output就可以访问IO空间,这又是如何实现的呢?本文就来讲述一下实现过程。

回到smdkv210_map_io函数中

staticvoid __init smdkv210_map_io(void)

{

    s5p_init_io(NULL, 0, S5P_VA_CHIPID);

    s3c24xx_init_clocks(24000000);

    s5pv210_gpiolib_init();

    s3c24xx_init_uarts(smdkv210_uartcfgs,

ARRAY_SIZE(smdkv210_uartcfgs));

#ifndefCONFIG_S5P_HIGH_RES_TIMERS

    s5p_set_timer_source(S5P_PWM2, S5P_PWM4);

#endif

    s5p_reserve_bootmem(s5pv210_media_devs,

                       ARRAY_SIZE(s5pv210_media_devs),

S5P_RANGE_MFC);

}

在执行完s5p_init_io(NULL, 0, S5P_VA_CHIPID)之后,调用了s5pv210_gpiolib_init()函数,这个就是解答疑问的关键点。

__init int s5pv210_gpiolib_init(void)

{

    structs3c_gpio_chip *chip = s5pv210_gpio_4bit;

    intnr_chips = ARRAY_SIZE(s5pv210_gpio_4bit);

    int gpioint_group = 0;

    int i = 0;

 

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

        if (chip->config == NULL) {

            chip->config= &gpio_cfg;

            chip->group = gpioint_group++;

        }

        if (chip->base == NULL)

            chip->base= S5PV210_BANK_BASE(i);

    }

 

    samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit,nr_chips);

    s5p_register_gpioint_bank(IRQ_GPIOINT, 0,S5P_GPIOINT_GROUP_MAXNR);

 

    return 0;

}

2.1 s5pv210_gpio_4bit

需要说明的是GPIO被分成了若干组,GPA0、GPA0、GPB、GPC0……,其中多作为外部中断IO组:GPH0、GPH1、GPH2、GPH3。

s5pv210_gpio_4bit结构体数组gpio分组的数据:

staticstruct s3c_gpio_chip s5pv210_gpio_4bit[] = {

    {

        .chip   ={

            .base   = S5PV210_GPA0(0),

            .ngpio  = S5PV210_GPIO_A0_NR,

            .label  = "GPA0",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPA1(0),

            .ngpio  = S5PV210_GPIO_A1_NR,

            .label  = "GPA1",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPB(0),

            .ngpio  = S5PV210_GPIO_B_NR,

            .label  = "GPB",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPC0(0),

            .ngpio  = S5PV210_GPIO_C0_NR,

            .label  = "GPC0",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPC1(0),

            .ngpio  = S5PV210_GPIO_C1_NR,

            .label  = "GPC1",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPD0(0),

            .ngpio  = S5PV210_GPIO_D0_NR,

            .label  = "GPD0",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPD1(0),

            .ngpio  = S5PV210_GPIO_D1_NR,

            .label  = "GPD1",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPE0(0),

            .ngpio  = S5PV210_GPIO_E0_NR,

            .label  = "GPE0",

        },

    }, {

        .chip   ={

            .base   = S5PV210_GPE1(0),

            .ngpio  = S5PV210_GPIO_E1_NR,

            .label  = "GPE1",

        },

    }, {

        .chip   ={

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值