在代码框架里增加具体单板的引脚配置,测试点亮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]#