当前位置: 首页 > news >正文

建设商场黄金网站邮箱检测网站

建设商场黄金网站,邮箱检测网站,手机触屏网站开发,房屋 哪个网站做的最好嵌入式Linux应用开发-第十五章具体单板的按键驱动程序 第十五章 具体单板的按键驱动程序(查询方式)15.1 GPIO操作回顾15.2 AM335X的按键驱动程序(查询方式)15.2.1 先看原理图确定引脚及操作方法15.2.2 再看芯片手册确定寄存器及操作方法15.2.3 编程15.2.3.1 程序框架15.2.3.2 硬… 嵌入式Linux应用开发-第十五章具体单板的按键驱动程序 第十五章 具体单板的按键驱动程序(查询方式)15.1 GPIO操作回顾15.2 AM335X的按键驱动程序(查询方式)15.2.1 先看原理图确定引脚及操作方法15.2.2 再看芯片手册确定寄存器及操作方法15.2.3 编程15.2.3.1 程序框架15.2.3.2 硬件相关的代码15.2.3.3 测试 15.2.4 课后作业 15.3 RK3288的按键驱动程序(查询方式)15.3.1 先看原理图确定引脚及操作方法15.3.2 再看芯片手册确定寄存器及操作方法15.3.3 编程15.3.1.1 程序框架 15.3.4 测试 15.4 RK3399的按键驱动程序(查询方式)15.4.1 先看原理图确定引脚及操作方法15.4.2 再看芯片手册确定寄存器及操作方法15.4.3 编程15.4.3.1 程序框架15.4.3.2 硬件相关的代码 15.4.4 测试15.4.5 课后作业 15.5 IMX6ULL-QEMU的按键驱动程序(查询方式)15.5.1 先看原理图确定引脚及操作方法15.5.2 再看芯片手册确定寄存器及操作方法15.5.3 编程15.5.3.1 程序框架15.5.3.2 硬件相关的代码 15.5.4 测试15.5.5 课后作业 第十五章 具体单板的按键驱动程序(查询方式) 15.1 GPIO操作回顾 参考《第四章 普适的 GPIO引脚操作方法》、《第五章 具体单板的 GPIO操作方法》。 15.2 AM335X的按键驱动程序(查询方式) 15.2.1 先看原理图确定引脚及操作方法 AM335X是底板核心板的结构打开底板原理图 xxxxxx_am335x_v12_原理图.pdf它有 4个按键本视频只操作一个按键原理图如下 平时按键电平为高按下按键后电平为低。 按键引脚为 GPIO1_25。 15.2.2 再看芯片手册确定寄存器及操作方法 步骤 1 使能 GPIO1模块 设置CM_PER_GPIO1_CLKCTRL寄存器的bit[18]为1bit[1:0]为0x2该寄存器地址为0x44E000000xAC。 步骤 2 把 GPIO1_25对应的引脚设置为 GPIO模式 要用哪一个寄存器来把 GPIO1_25对应的引脚设置为 GPIO模式 ① 在核心板原理图 ET-som335X原理图.pdf里搜“GPIO1_25”可以看到下图确定 pin number为 U16 ② 在芯片手册 AM335x Sitara™ Processors.pdf里搜“U16”可得下图引脚名为 GPMC_A9用作 GPIO时要设置为 mode 7 ③ 在芯片手册 AM335x_datasheet_spruh73p.pdf中搜 gpmc_a9 所以要把GPIO1_25对应的引脚设置为 GPIO模式要设置 conf_gpmc_a9寄存器的bit[5]为1bit[2:0]为 7这个寄存器的地址是 0x44E100000x864。 步骤 3 设置 GPIO1内部寄存器把 GPIO1_25设置为输入引脚读数据寄存器 GPIO_OE寄存器地址为 0x4804C0000x134bit[25]设置为 1。 GPIO_DATAIN寄存器地址为 0x4804C0000x138读其 bit[25]。 15.2.3 编程 15.2.3.1 程序框架 使用 GIT下载所有源码后本节源码位于如下目录 01_all_series_quickstart\ 05_嵌入式 Linux驱动开发基础知识\source\ 04_button_drv\02_button_drv_for_boards\01_button_drv_for_am335x 15.2.3.2 硬件相关的代码 主要看 board_am335x.c先看它的入口函数代码如下。 第 84行向上层驱动注册一个 button_operations结构体该结构体在第 7680行定义。 76 static struct button_operations my_buttons_ops { 77 .count 1, 78 .init board_am335x_button_init, 79 .read board_am335x_button_read, 80 }; 81 82 int board_am335x_button_drv_init(void) 83 { 84 register_button_operations(my_buttons_ops); 85 return 0; 86 } 87button_operations结构体中有 init函数指针它指向 board_am335x_button_init函数在里面将会初始化 LED引脚使能、设置为 GPIO模式、设置为输出引脚。代码如下。 值得关注的是第 3235行对于寄存器要先使用 ioremap得到它的虚拟地址以后使用虚拟地址访问寄存器。 21 static volatile unsigned int *CM_PER_GPIO1_CLKCTRL; 22 static volatile unsigned int *conf_gpmc_a9; 23 static volatile unsigned int *GPIO1_OE; 24 static volatile unsigned int *GPIO1_DATAIN; 25 26 static void board_am335x_button_init (int which) /* 初始化 button, which-哪个 button */ 27 { 28 if (which 0) 29 { 30 if (!CM_PER_GPIO1_CLKCTRL) 31 { 32 CM_PER_GPIO1_CLKCTRL ioremap(0x44E00000 0xAC, 4); 33 conf_gpmc_a9 ioremap(0x44E10000 0x864, 4); 34 GPIO1_OE ioremap(0x4804C000 0x134, 4); 35 GPIO1_DATAIN ioremap(0x4804C000 0x138, 4); 36 } 37 38 //printk(%s %s line %d, led %d\n, __FILE__, __FUNCTION__, __LINE__, which); 39 /* a. 使能 GPIO1 40 * set PRCM to enalbe GPIO1 41 * set CM_PER_GPIO1_CLKCTRL (0x44E00000 0xAC) 42 * val: (118) | 0x2 43 */ 44 *CM_PER_GPIO1_CLKCTRL (118) | 0x2; 45 46 /* b. 设置 GPIO1_25的功能让它工作于 GPIO模式 47 * set Control Module to set GPIO1_25 (U16) used as GPIO 48 * conf_gpmc_a9 as mode 7 49 * addr : 0x44E10000 0x864 50 * bit[5] : 1, Input enable value for the PAD 51 * bit[2:0] : mode 7 52 */ 53 *conf_gpmc_a9 (15) | 7; 54 55 /* c. 设置 GPIO1_25的方向让它作为输入引脚 56 * set GPIO1s registers , to set 设置 GPIO1_25的方向S dir (input) 57 * GPIO_OE 58 * addr : 0x4804C000 0x134 59 * set bit 25 60 */ 61 62 *GPIO1_OE | (125); 63 } 64 65 } 66 button_operations结构体中还有有 read函数指针它指向 board_am335x_button_read函数在里面将会读取并返回按键引脚的电平。代码如下。 67 static int board_am335x_button_read (int which) /* 读 button, which-哪个 */ 68 { 69 printk(%s %s line %d, button %d, 0x%x\n, __FILE__, __FUNCTION__, __LINE__, which, *GPIO1_DATAIN); 70 if (which 0) 71 return (*GPIO1_DATAIN (125)) ? 1 : 0; 72 else 73 return 0; 74 } 75 15.2.3.3 测试 安装驱动程序之后执行测试程序观察它的返回值(执行测试程序的同时操作按键) # insmod button_drv.ko # insmod board_am335x.ko # ./button_test /dev/xxxxxx_button0 15.2.4 课后作业 ① 修改 board_am335x.c增加更多按键 ② 修改 button_test.c使用按键来点灯 15.3 RK3288的按键驱动程序(查询方式) 15.3.1 先看原理图确定引脚及操作方法 Firefly的 RK3288开发板上没有按键我们为它制作的扩展板上有 1个按键。在扩展板原理图rk3288_extend_v12_0715.pdf中可以看到按键如下 平时按键电平为高按下按键后电平为低。 按键引脚为 GPIO7_B1。 15.3.2 再看芯片手册确定寄存器及操作方法 芯片手册为 Rockchip_RK3288_TRM_V1.2_Part1-20170321.pdf不过我们总结如下。 步骤 1 使能 GPIO7模块 设置 CRU_CLKGATE14_CON寄存器的 bit[7]为 0。 要设置 bit7必须同时设置 bit23为 1。 该寄存器地址为 0xFF7600000x198。 步骤 2 把 GPIO7_B1对应的引脚设置为 GPIO模式 设置 GRF_GPIO7B_IOMUX寄存器的 bit[3:2]为 0b00。 要设置 bit[3:2]必须同时设置 bit[19:18]为 0b11。 该寄存器地址为 0xFF7700000x0070。 步骤 3 设置 GPIO7内部寄存器把 GPIO7_B1设置为输入引脚读数据寄存器 GPIO_SWPORTA_DDR方向寄存器地址为 0xFF7E0000 0x0004bit[9]设置为 0。 GPIO_EXT_PORTA外部端口寄存器地址为 0xFF7E0000 0x0050读其 bit[9]。 注意 GPIO_A0~A7 对应 bit0bit7GPIO_B0B7 对应 bit8~bit15 GPIO_C0~C7 对应 bit16bit23GPIO_D0D7 对应 bit24~bit31 15.3.3 编程 15.3.1.1 程序框架 使用 GIT下载所有源码后本节源码位于如下目录 01_all_series_quickstart\ 05_嵌入式 Linux驱动开发基础知识\source\ 04_button_drv\02_button_drv_for_boards\02_button_drv_for_rk3288 15.3.1.2 硬件相关的代码 主要看 board_rk3288.c先看它的入口函数代码如下。 第 81行向上层驱动注册一个 button_operations结构体该结构体在第 7377行定义。 73 static struct button_operations my_buttons_ops { 74 .count 1, 75 .init board_rk3288_button_init, 76 .read board_rk3288_button_read, 77 }; 78 79 int board_rk3288_button_drv_init(void) 80 { 81 register_button_operations(my_buttons_ops); 82 return 0; 83 } button_operations结构体中有 init函数指针它指向 board_rk3288_button_init函数在里面将会初始化 LED引脚使能、设置为 GPIO模式、设置为输出引脚。代码如下。 值得关注的是第 3235行对于寄存器要先使用 ioremap得到它的虚拟地址以后使用虚拟地址访问寄存器。 21 static volatile unsigned int *CRU_CLKGATE14_CON; 22 static volatile unsigned int *GRF_GPIO7B_IOMUX ; 23 static volatile unsigned int *GPIO7_SWPORTA_DDR; 24 static volatile unsigned int *GPIO7_EXT_PORTA ; 25 26 static void board_rk3288_button_init (int which) /* 初始化 button, which-哪个 button */ 27 { 28 if (which 0) 29 { 30 if (!CRU_CLKGATE14_CON) 31 { 32 CRU_CLKGATE14_CON ioremap(0xFF760000 0x0198, 4); 33 GRF_GPIO7B_IOMUX ioremap(0xFF770000 0x0070, 4); 34 GPIO7_SWPORTA_DDR ioremap(0xFF7E0000 0x0004, 4); 35 GPIO7_EXT_PORTA ioremap(0xFF7E0000 0x0050, 4); 36 } 37 38 /* rk3288 GPIO7_B1 */ 39 /* a. 使能 GPIO7 40 * set CRU to enable GPIO7 41 * CRU_CLKGATE14_CON 0xFF760000 0x198 42 * (1(716)) | (07) 43 */ 44 *CRU_CLKGATE14_CON (1(716)) | (07); 45 46 /* b. 设置 GPIO7_B1用于 GPIO 47 * set PMU/GRF to configure GPIO7_B1 as GPIO 48 * GRF_GPIO7B_IOMUX 0xFF770000 0x0070 49 * bit[3:2] 0b00 50 * (3(216)) | (02) 51 */ 52 *GRF_GPIO7B_IOMUX (3(216)) | (02); 53 54 /* c. 设置 GPIO7_B1作为 input引脚 55 * set GPIO_SWPORTA_DDR to configure GPIO7_B1 as input 56 * GPIO_SWPORTA_DDR 0xFF7E0000 0x0004 57 * bit[9] 0b0 58 */ 59 *GPIO7_SWPORTA_DDR ~(19); 60 } 61 62 } button_operations结构体中还有有 read函数指针它指向 board_rk3288_button_read函数在里面将会读取并返回按键引脚的电平。代码如下。 64 static int board_rk3288_button_read (int which) /* 读 button, which-哪个 */ 65 { 66 //printk(%s %s line %d, button %d, 0x%x\n, __FILE__, __FUNCTION__, __LINE__, which, *GPIO1_DATAIN); 67 if (which 0) 68 return (*GPIO7_EXT_PORTA (19)) ? 1 : 0; 69 else 70 return 0; 71 } 15.3.4 测试 安装驱动程序之后执行测试程序观察它的返回值(执行测试程序的同时操作按键) # insmod button_drv.ko # insmod board_rk3288.ko # ./button_test /dev/xxxxxx_button0 15.3.5 课后作业 ① 修改 button_test.c使用按键来点灯 15.4 RK3399的按键驱动程序(查询方式) 15.4.1 先看原理图确定引脚及操作方法 Firefly的 RK3399开发板上没有按键我们为它制作的扩展板上有 3个按键。在扩展板原理图rk3399_extend_v12_0709final.pdf中可以看到按键如下 平时按键电平为高按下按键后电平为低。 按键引脚为 GPIO0_B1、GPIO0_B2、GPIO0_B4。 本视频中只操作一个按键GPIO0_B1。 15.4.2 再看芯片手册确定寄存器及操作方法 芯片手册为 Rockchip RK3399TRM V1.3 Part1.pdf和 Rockchip RK3399TRM V1.3 Part2.pdf不过我们总结如下。 步骤 1 使能 GPIO0模块 设置 PMUCRU_CLKGATE_CON1寄存器的 bit[3]为 0。 要设置 bit3必须同时设置 bit19为 1。 该寄存器地址为 0xFF760000 0x0104。 步骤 2 把 GPIO0_B1对应的引脚设置为 GPIO模式 设置 PMUGRF_GPIO0B_IOMUX寄存器的 bit[3:2]为 0b00。 要设置 bit[3:2]必须同时设置 bit[19:18]为 0b11。 该寄存器地址为 0xFF3100000x0004。 步骤 3 设置 GPIO0内部寄存器把 GPIO0_B1设置为输入引脚读数据寄存器 这些寄存器的介绍在芯片手册 Rockchip RK3399TRM V1.3 Part2.pdf中。 GPIO_SWPORTA_DDR方向寄存器地址为 0xFF720000 0x0004bit[9]设置为 0。 GPIO_EXT_PORTA外部端口寄存器地址为 0xFF720000 0x0050读其 bit[9]。 注意 GPIO_A0~A7 对应 bit0bit7GPIO_B0B7 对应 bit8~bit15 GPIO_C0~C7 对应 bit16bit23GPIO_D0D7 对应 bit24~bit31 15.4.3 编程 15.4.3.1 程序框架 使用 GIT下载所有源码后本节源码位于如下目录 01_all_series_quickstart\ 05_嵌入式 Linux驱动开发基础知识\source\ 04_button_drv\02_button_drv_for_boards\03_button_drv_for_rk3399 15.4.3.2 硬件相关的代码 主要看 board_rk3399.c先看它的入口函数代码如下。 第 81行向上层驱动注册一个 button_operations结构体该结构体在第 7377行定义。 73 static struct button_operations my_buttons_ops { 74 .count 1, 75 .init board_rk3399_button_init, 76 .read board_rk3399_button_read, 77 }; 78 79 int board_rk3399_button_drv_init(void) 80 { 81 register_button_operations(my_buttons_ops); 82 return 0; 83 } button_operations结构体中有 init函数指针它指向 board_rk3399_button_init函数在里面将会初始化 LED引脚使能、设置为 GPIO模式、设置为输出引脚。代码如下。 值得关注的是第 3235行对于寄存器要先使用 ioremap得到它的虚拟地址以后使用虚拟地址访问寄存器。 21 static volatile unsigned int *PMUCRU_CLKGATE_CON1; 22 static volatile unsigned int *GRF_GPIO0B_IOMUX ; 23 static volatile unsigned int *GPIO0_SWPORTA_DDR; 24 static volatile unsigned int *GPIO0_EXT_PORTA ; 25 26 static void board_rk3399_button_init (int which) /* 初始化 button, which-哪个 button */ 27 { 28 if (which 0) 29 { 30 if (!PMUCRU_CLKGATE_CON1) 31 { 32 PMUCRU_CLKGATE_CON1 ioremap(0xFF760000 0x0104, 4); 33 GRF_GPIO0B_IOMUX ioremap(0xFF3100000x0004, 4); 34 GPIO0_SWPORTA_DDR ioremap(0xFF720000 0x0004, 4); 35 GPIO0_EXT_PORTA ioremap(0xFF720000 0x0050, 4); 36 } 37 38 /* rk3399 GPIO0_B1 */ 39 /* a. 使能 GPIO0 40 * set CRU to enable GPIO0 41 * PMUCRU_CLKGATE_CON1 0xFF760000 0x0104 42 * (1(316)) | (03) 43 */ 44 *PMUCRU_CLKGATE_CON1 (1(316)) | (03); 45 46 /* b. 设置 GPIO0_B1用于 GPIO 47 * set PMU/GRF to configure GPIO0_B1 as GPIO 48 * GRF_GPIO0B_IOMUX 0xFF3100000x0004 49 * bit[3:2] 0b00 50 * (3(216)) | (02) 51 */ 52 *GRF_GPIO0B_IOMUX (3(216)) | (02); 53 54 /* c. 设置 GPIO0_B1作为 input引脚 55 * set GPIO_SWPORTA_DDR to configure GPIO0_B1 as input 56 * GPIO_SWPORTA_DDR 0xFF720000 0x0004 57 * bit[9] 0b0 58 */ 59 *GPIO0_SWPORTA_DDR ~(19); 60 } 61 62 } button_operations结构体中还有有 read函数指针它指向 board_rk3399_button_read函数在里面将会读取并返回按键引脚的电平。代码如下。 64 static int board_rk3399_button_read (int which) /* 读 button, which-哪个 */ 65 { 66 //printk(%s %s line %d, button %d, 0x%x\n, __FILE__, __FUNCTION__, __LINE__, which, *GPIO1_DATAIN); 67 if (which 0) 68 return (*GPIO0_EXT_PORTA (19)) ? 1 : 0; 69 else 70 return 0; 71 } 15.4.4 测试 安装驱动程序之后执行测试程序观察它的返回值(执行测试程序的同时操作按键) # insmod button_drv.ko # insmod board_rk3399.ko # ./button_test /dev/xxxxxx_button0 15.4.5 课后作业 ① 修改 board_rk3399.c增加更多按键 ② 修改 button_test.c使用按键来点灯 15.5 IMX6ULL-QEMU的按键驱动程序(查询方式) 使用 QEMU模拟的硬件它的硬件资源可以随意扩展。 在 IMX6ULL QEMU 虚拟开发板上我们为它设计了 2个 按键。在 QEMU的 GUI上有 4个按键右边的 2个留待以后用于电源管理。 15.5.1 先看原理图确定引脚及操作方法 平时按键电平为低按下按键后电平为高。 按键引脚为 GPIO5_IO01、GPIO1_IO18。 15.5.2 再看芯片手册确定寄存器及操作方法 步骤 1 使能 GPIO1、GPIO5 设置 b[31:30]、b[27:26]就可以使能 GPIO5、GPIO1设置为什么值呢 注意在 imx6ullrm.pdf中CCM_CCGR1的 b[31:30]是保留位我以前写程序时错用了 imx6ul(不是imx6ull)的手册导致程序中额外操作了这些保留位。不去设置 b[31:30]GPIO5也是默认使能的。 看下图设置为 0b11 ① 00该 GPIO模块全程被关闭 ② 01该 GPIO模块在 CPU run mode情况下是使能的在 WAIT或 STOP模式下关闭 ③ 10保留 ④ 11该 GPIO模块全程使能 步骤 2 设置 GPIO5_IO01、GPIO1_IO18为 GPIO模式 ① 对于 GPIO5_IO01设置如下寄存器 ② 对于 GPIO1_IO18设置如下寄存器 步骤 3 设置 GPIO5_IO01、GPIO1_IO18为输入引脚读取引脚电平 寄存器地址为 设置方向寄存器把引脚设置为输出引脚 读取引脚状态寄存器得到引脚电平 15.5.3 编程 15.5.3.1 程序框架 使用 GIT下载所有源码后本节源码位于如下目录 01_all_series_quickstart\ 05_嵌入式 Linux驱动开发基础知识\source\ 04_button_drv\02_button_drv_for_boards\04_button_drv_for_xxxxxx_imx6ull-qemu 15.5.3.2 硬件相关的代码 主要看 board_xxxxxx_imx6ull-qemu.c。 涉及的寄存器挺多一个一个去执行 ioremap效率太低。 先定义结构体然后对结构体指针进行 ioremap。 对于 IOMUXC可以如下定义 struct iomux { volatile unsigned int unnames[23]; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO02; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO05; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO06; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO07; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO08; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA; volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B; }; struct iomux *iomux ioremap(0x20e0000, sizeof(struct iomux)); 对于 GPIO可以如下定义 struct imx6ull_gpio { volatile unsigned int dr; volatile unsigned int gdir; volatile unsigned int psr; volatile unsigned int icr1; volatile unsigned int icr2; volatile unsigned int imr; volatile unsigned int isr; volatile unsigned int edge_sel; }; struct imx6ull_gpio *gpio1 ioremap(0x209C000, sizeof(struct imx6ull_gpio)); struct imx6ull_gpio *gpio5 ioremap(0x20AC000, sizeof(struct imx6ull_gpio)); 看一个驱动程序先看它的入口函数代码如下。 第 127行向上层驱动注册一个 button_operations结构体该结构体在第 119123行定义。 119 static struct button_operations my_buttons_ops { 120 .count 2, 121 .init board_imx6ull_button_init, 122 .read board_imx6ull_button_read, 123 }; 124 125 int board_imx6ull_button_drv_init(void) 126 { 127 register_button_operations(my_buttons_ops); 128 return 0; 129 } button_operations结构体中有 init函数指针它指向 board_imx6ull_button_init函数在里面将会初始化 LED引脚使能、设置为 GPIO模式、设置为输出引脚。代码如下。 值得关注的是第 6570行对于寄存器要先使用 ioremap得到它的虚拟地址以后使用虚拟地址访问寄存器。 50 /* enable GPIO1,GPIO5 */ 51 static volatile unsigned int *CCM_CCGR1; 52 53 /* set GPIO5_IO03 as GPIO */ 54 static volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1; 55 56 static struct iomux *iomux; 57 58 static struct imx6ull_gpio *gpio1; 59 static struct imx6ull_gpio *gpio5; 60 61 static void board_imx6ull_button_init (int which) /* 初始化 button, which-哪个 button */ 62 { 63 if (!CCM_CCGR1) 64 { 65 CCM_CCGR1 ioremap(0x20C406C, 4); 66 IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1 ioremap(0x229000C, 4); 67 68 iomux ioremap(0x20e0000, sizeof(struct iomux)); 69 gpio1 ioremap(0x209C000, sizeof(struct imx6ull_gpio)); 70 gpio5 ioremap(0x20AC000, sizeof(struct imx6ull_gpio)); 71 } 72 73 if (which 0) 74 { 75 /* 1. enable GPIO5 76 * CG15, b[31:30] 0b11 77 */ 78 *CCM_CCGR1 | (330); 79 80 /* 2. set GPIO5_IO01 as GPIO 81 * MUX_MODE, b[3:0] 0b101 82 */ 83 *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1 5; 84 85 /* 3. set GPIO5_IO01 as input 86 * GPIO5 GDIR, b[1] 0b0 87 */ 88 gpio5-gdir ~(11); 89 } 90 else if(which 1) 91 { 92 /* 1. enable GPIO1 93 * CG13, b[27:26] 0b11 94 */ 95 *CCM_CCGR1 | (326); 96 97 /* 2. set GPIO1_IO18 as GPIO 98 * MUX_MODE, b[3:0] 0b101 99 */ 100 iomux-IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B 5; 101 102 /* 3. set GPIO1_IO18 as input 103 * GPIO1 GDIR, b[18] 0b0 104 */ 105 gpio1-gdir ~(118); 106 } 107 108 } button_operations结构体中还有有 read函数指针它指向 board_imx6ull_button_read函数在里面将会读取并返回按键引脚的电平。代码如下。 110 static int board_imx6ull_button_read (int which) /* 读 button, which-哪个 */ 111 { 112 //printk(%s %s line %d, button %d, 0x%x\n, __FILE__, __FUNCTION__, __LINE__, which, *GPIO1_DATAIN); 113 if (which 0) 114 return (gpio5-psr (11)) ? 1 : 0; 115 else 116 return (gpio1-psr (118)) ? 1 : 0; 117 } 15.5.4 测试 先启动 IMX6ULL QEMU模拟器挂载 NFS文件系统。 运行 QEMU时 QEMU内部为主机虚拟出一个网卡, IP为 10.0.2.2 IMX6ULL有一个网卡, IP为 10.0.2.15 它连接到主机的虚拟网卡。 这样 IMX6ULL就可以通过 10.0.2.2去访问 Ubuntu了。 安装驱动程序之后执行测试程序观察它的返回值(执行测试程序的同时操作按键) # insmod button_drv.ko # insmod board_drv.ko # insmod board_xxxxxx_imx6ull-qemu.ko # ./button_test /dev/xxxxxx_button0 # ./button_test /dev/xxxxxx_button1 15.5.5 课后作业 ① 修改 button_test.c使用按键来点灯
文章转载自:
http://www.morning.llxyf.cn.gov.cn.llxyf.cn
http://www.morning.dnmgr.cn.gov.cn.dnmgr.cn
http://www.morning.jwrcz.cn.gov.cn.jwrcz.cn
http://www.morning.yfwygl.cn.gov.cn.yfwygl.cn
http://www.morning.nrpp.cn.gov.cn.nrpp.cn
http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn
http://www.morning.hpnhl.cn.gov.cn.hpnhl.cn
http://www.morning.hffjj.cn.gov.cn.hffjj.cn
http://www.morning.mlnzx.cn.gov.cn.mlnzx.cn
http://www.morning.dqpnd.cn.gov.cn.dqpnd.cn
http://www.morning.yrrnx.cn.gov.cn.yrrnx.cn
http://www.morning.rcntx.cn.gov.cn.rcntx.cn
http://www.morning.tcylt.cn.gov.cn.tcylt.cn
http://www.morning.xsjfk.cn.gov.cn.xsjfk.cn
http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn
http://www.morning.sooong.com.gov.cn.sooong.com
http://www.morning.mrbmc.cn.gov.cn.mrbmc.cn
http://www.morning.npxht.cn.gov.cn.npxht.cn
http://www.morning.tdgwg.cn.gov.cn.tdgwg.cn
http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn
http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn
http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn
http://www.morning.lpcct.cn.gov.cn.lpcct.cn
http://www.morning.fhsgw.cn.gov.cn.fhsgw.cn
http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn
http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com
http://www.morning.bmqls.cn.gov.cn.bmqls.cn
http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn
http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn
http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn
http://www.morning.bpmnx.cn.gov.cn.bpmnx.cn
http://www.morning.jwfkk.cn.gov.cn.jwfkk.cn
http://www.morning.sgfgz.cn.gov.cn.sgfgz.cn
http://www.morning.ogzjf.cn.gov.cn.ogzjf.cn
http://www.morning.rpzth.cn.gov.cn.rpzth.cn
http://www.morning.fswml.cn.gov.cn.fswml.cn
http://www.morning.zhengdaotang.cn.gov.cn.zhengdaotang.cn
http://www.morning.lywcd.cn.gov.cn.lywcd.cn
http://www.morning.cnhgc.cn.gov.cn.cnhgc.cn
http://www.morning.xwqxz.cn.gov.cn.xwqxz.cn
http://www.morning.gstg.cn.gov.cn.gstg.cn
http://www.morning.ltspm.cn.gov.cn.ltspm.cn
http://www.morning.qjlkp.cn.gov.cn.qjlkp.cn
http://www.morning.srrrz.cn.gov.cn.srrrz.cn
http://www.morning.jphxt.cn.gov.cn.jphxt.cn
http://www.morning.pxrfm.cn.gov.cn.pxrfm.cn
http://www.morning.lrskd.cn.gov.cn.lrskd.cn
http://www.morning.zjqwr.cn.gov.cn.zjqwr.cn
http://www.morning.ymjrg.cn.gov.cn.ymjrg.cn
http://www.morning.lblsx.cn.gov.cn.lblsx.cn
http://www.morning.czxrg.cn.gov.cn.czxrg.cn
http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn
http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn
http://www.morning.zwtp.cn.gov.cn.zwtp.cn
http://www.morning.trjp.cn.gov.cn.trjp.cn
http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn
http://www.morning.wlddq.cn.gov.cn.wlddq.cn
http://www.morning.drnfc.cn.gov.cn.drnfc.cn
http://www.morning.shyqcgw.cn.gov.cn.shyqcgw.cn
http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn
http://www.morning.mbpzw.cn.gov.cn.mbpzw.cn
http://www.morning.djpzg.cn.gov.cn.djpzg.cn
http://www.morning.qjxkx.cn.gov.cn.qjxkx.cn
http://www.morning.zydr.cn.gov.cn.zydr.cn
http://www.morning.hpprx.cn.gov.cn.hpprx.cn
http://www.morning.jkcpl.cn.gov.cn.jkcpl.cn
http://www.morning.sxcwc.cn.gov.cn.sxcwc.cn
http://www.morning.mtrrf.cn.gov.cn.mtrrf.cn
http://www.morning.nlgnk.cn.gov.cn.nlgnk.cn
http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn
http://www.morning.kjxgc.cn.gov.cn.kjxgc.cn
http://www.morning.yrxcn.cn.gov.cn.yrxcn.cn
http://www.morning.rymb.cn.gov.cn.rymb.cn
http://www.morning.fpqq.cn.gov.cn.fpqq.cn
http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn
http://www.morning.qnbzs.cn.gov.cn.qnbzs.cn
http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn
http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn
http://www.morning.hdscx.cn.gov.cn.hdscx.cn
http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn
http://www.tj-hxxt.cn/news/277733.html

相关文章:

  • 数码印花图案设计网站制作网站需要多少时间
  • 专业网站运营制作windows2008 iis 网站配置
  • 一个完整的网站 技术dw做网站怎么替换字体
  • 丹阳网站建设怎么样凡客诚品为什么没落了
  • 在线生成个人网站衡水做wap网站建设
  • 网站 动画 怎么做的湘潭seo快速排名
  • asp.net 微网站开发教程做动画 的 网站有哪些
  • 网站seo主管招聘汕头建站方案
  • 网站制作和如何推广做变形记图网站
  • 网站运营需要什么条件大连h5网站开发
  • 一个网站一级栏目内网搭建wordpress
  • 手机网站开发工具网络营销专业专升本考什么
  • 廊坊专业做网站企业大全企业名录
  • 灯饰网站建设网站建设空心正方形
  • 一个备案号多个网站交易平台app下载
  • 买了网站主机后如何建设网站绍兴cms建站系统
  • 在线免费网站排名优化七牛怎么做网站服务器
  • 成都网站制作芜湖厂商网页设计与网站建设在线考试1
  • 专门做推荐的网站用node.js可以做网站吗
  • 专业网站开发公司地址做资料网站违法
  • wordpress 英文 企业网站模板网络营销10大平台
  • 青海建设厅报名网站aqq网站开发
  • 网站建设需要哪些技术人员指数基金排名前十名
  • 广州seo网站开发dw做网站小技巧
  • 广州网站定制开发贵州网站建设kuhugz
  • 建一个网站需要什么流程离婚在线律师
  • 2017 上海网站备案wordpress 国人 原创 主体
  • 商业网站建设与运营wordpress 分隔符 sp
  • 太原做网站 小程序wordpress更改后登录地址
  • 拖拽式建站做一个搜索引擎网站要多少钱