韦东山_05_嵌入式Linux驱动开发基础知识_第10章 LED 模板驱动程序的改造:总线设备驱动模型

在代码框架里增加具体单板的引脚配置,测试点亮LED
代码位置

1_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/

static int board_demo_led_init (int which) /* 初始化LED, which-哪个LED */       
{   
    //printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which);
    unsigned int val;
    printk("init gpio: group %d, pin %d\n", GROUP(g_ledpins[which]), PIN(g_ledpins[which]));
    switch(GROUP(g_ledpins[which]))
    {
        case 5:
        {
            printk("init pin of group 5 ...\n");

            if (!CCM_CCGR1)
            {
                CCM_CCGR1                               = ioremap(0x20C406C, 4);
                IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = ioremap(0x2290014, 4);
                GPIO5_GDIR                              = ioremap(0x020AC000 + 0x4, 4);
                GPIO5_DR                                = ioremap(0x020AC000 + 0, 4);
            }
            
            /* GPIO5_IO03 */
            /* a. 使能GPIO5
            * set CCM to enable GPIO5
            * CCM_CCGR1[CG15] 0x20C406C
            * bit[31:30] = 0b11
            */
            *CCM_CCGR1 |= (3<<30);
            
            /* b. 设置GPIO5_IO03用于GPIO
            * set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3
            *      to configure GPIO5_IO03 as GPIO
            * IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3  0x2290014
            * bit[3:0] = 0b0101 alt5
            */
            val = *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
            val &= ~(0xf);
            val |= (5);
            *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = val;
            
            
            /* b. 设置GPIO5_IO03作为output引脚
            * set GPIO5_GDIR to configure GPIO5_IO03 as output
            * GPIO5_GDIR  0x020AC000 + 0x4
            * bit[3] = 0b1
            */
            *GPIO5_GDIR |= (1<<3);
            break;
        }
        case 1:
        {
            printk("init pin of group 1 ...\n");
            break;
        }
        case 2:
        {
            printk("init pin of group 2 ...\n");
            break;
        }
        case 3:
        {
            printk("init pin of group 3 ...\n");
            break;
        }
    }
    
    return 0;
}

static int board_demo_led_ctl (int which, char status) /* 控制LED, which-哪个LED, status:1-亮,0-灭 */
{
    //printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off");
    printk("set led %s: group %d, pin %d\n", status ? "on" : "off", GROUP(g_ledpins[which]), PIN(g_ledpins[which]));

    switch(GROUP(g_ledpins[which]))
    {
        case 5:
        {
            printk("set pin of group 0 ...\n");
            if (status) /* on: output 0*/
            {
                /* d. 设置GPIO5_DR输出低电平
                * set GPIO5_DR to configure GPIO5_IO03 output 0
                * GPIO5_DR 0x020AC000 + 0
                * bit[3] = 0b0
                */
                *GPIO5_DR &= ~(1<<3);
            }
            else  /* off: output 1*/
            {
                /* e. 设置GPIO5_IO3输出高电平
                * set GPIO5_DR to configure GPIO5_IO03 output 1
                * GPIO5_DR 0x020AC000 + 0
                * bit[3] = 0b1
                */ 
                *GPIO5_DR |= (1<<3);
            }
            break;
        }
        case 1:
        {
            printk("set pin of group 1 ...\n");
            break;
        }
        case 2:
        {
            printk("set pin of group 2 ...\n");
            break;
        }
        case 3:
        {
            printk("set pin of group 3 ...\n");
            break;
        }
    }

    return 0;
}
[root@imx6ull:/my_bus_ko]#
[root@imx6ull:/my_bus_ko]# rmmod chip_demo_gpio.ko
[root@imx6ull:/my_bus_ko]# insmod chip_demo_gpio.ko
[root@imx6ull:/my_bus_ko]# ./ledtest /dev/100ask_led0 on
[  533.511749] /home/alientek/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/leddrv.c led_drv_open line 77
[  533.527646] init gpio: group 5, pin 3
[  533.531330] init pin of group 5 ...
[  533.536106] /home/alientek/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/leddrv.c led_drv_write line 64
[  533.564449] set led on: group 5, pin 3
[  533.568233] set pin of group 0 ...
[  533.571709] /home/alientek/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/leddrv.c led_drv_close line 86
[root@imx6ull:/my_bus_ko]#
[root@imx6ull:/my_bus_ko]#
[root@imx6ull:/my_bus_ko]# ./ledtest /dev/100ask_led0 off
[  538.910261] /home/alientek/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/leddrv.c led_drv_open line 77
[  538.926393] init gpio: group 5, pin 3
[  538.930081] init pin of group 5 ...
[  538.933920] /home/alientek/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/leddrv.c led_drv_write line 64
[  538.951044] set led off: group 5, pin 3
[  538.963102] set pin of group 0 ...
[  538.969076] /home/alientek/01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/04_led_drv_template_bus_dev_drv/leddrv.c led_drv_close line 86
[root@imx6ull:/my_bus_ko]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值