91 .ioctl = key_ioctl,
92 };
93
94 void gpio_addr(void){
95 printk('
96 printk('
97 printk('
98 printk('
99 printk('
100 printk('
101 }
102
103
104
105 void led_on_off(void){
106 ssleep(1);
107 DR_GPIO3 |= (0x01 << 23); //将GPIO2_23置1
108 ssleep(1);
109 DR_GPIO3 &= ~(0x01 << 23); //将GPIO2_23清零
110 ssleep(1);
111 DR_GPIO3 |= (0x01 << 23); //将GPIO2_23置1
112 ssleep(1);
113 DR_GPIO3 &= ~(0x01 << 23); //将GPIO2_23清零
114 ssleep(1);
115 DR_GPIO3 |= (0x01 << 23); //将GPIO2_23置1
116 ssleep(1);
117 DR_GPIO3 &= ~(0x01 << 23); //将GPIO2_23清零
118 ssleep(1);
119 DR_GPIO3 |= (0x01 << 23); //将GPIO2_23置1
120 ssleep(1);
121 DR_GPIO3 &= ~(0x01 << 23); //将GPIO2_23清零
122 ssleep(1);
123 DR_GPIO3 |= (0x01 << 23); //将GPIO2_23置1
124 }
125
126 static int __init key_irq_init(void)
127 {
128 printk('
129 //register and mknod
130 major = register_chrdev(0,Driver_NAME,&key_fops);
131 drv_class = class_create(THIS_MODULE,Driver_NAME);
132 drv_class_dev = device_create(drv_class,NULL,MKDEV(major,0),NULL,DEVICE_NAME); /*/dev/key_query*/
133
134 //IO端口申请 ioremap 可以直接通过指针来访问这些地址
135 base_iomux = ioremap(0x43FAC000,0xFFF);
136 base_gpio3 = ioremap(0x53FA4000,0xFFF);
137
138 //MUX_CTL
139 MUX_CTL &= ~(0x07 << 0);
140 MUX_CTL |= (0X05 << 0); //设置为ALT5 GPIO3_23 ERR_LED
141 //PAD_CTL
142 PAD_CTL &= ~(0x01<<13 | 0x01<<3 | 0x03<<1 | 0x01<<0); //1.8v 不需要上拉下拉 CMOS输出 slew rate
143 //GDIR_GPIO3 配置为输出模式
144 GDIR_GPIO3 &= ~(0x01 << 23);
145 GDIR_GPIO3 |= (0x01 << 23); //配置为输出模式
146
147 //DR_GPIO3 配置为输出0 点亮ERR_LED
148 DR_GPIO3 &= ~(0x01 << 23); //将GPIO2_23清零
149 DR_GPIO3 &= ~(0x01 << 23); //将GPIO2_23清零
150 gpio_addr();
151 led_on_off();
152 return 0;
153 }
154
155 static void __exit key_irq_exit(void)
156 {
157 gpio_addr();
158 printk('
159 led_on_off();
160
161 unregister_chrdev(major,Driver_NAME);
162 device_unregister(drv_class_dev);
163 class_destroy(drv_class);
164
165 //释放IO端口
166 iounmap(base_iomux);
167 iounmap(base_gpio3);
168 }
169
170
171 /* 这两行指定驱动程序的初始化函数和卸载函数 */
172 module_init(key_irq_init);
173 module_exit(key_irq_exit);
174
175 /* 描述驱动程序的一些信息,不是必须的 */
176 MODULE_AUTHOR('Lover雪儿');
177 MODULE_VERSION('0.1.0');
178 MODULE_DESCRIPTION('IMX257 key Driver');
179 MODULE_LICENSE('GPL');
五.err_led测试程序.
1 /******************************
2 内核调试之自制寄存器读写工具(应用)
3 *****************************/
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17
18 #define LED_ON 0
19 #define LED_OFF 1
20
21 /*
22 Usage:
23 ./err_led_test
24 */
25
26 void print_usage(char *file)
27 {
28 printf('Usage: n');
29 printf('%s
30 }
31
32 int main(int argc, char **argv)
33 {
34 int fd ;
35
36 if(argc != 2){
37 print_usage(argv[0]);
38 return -1;
39 }
40
41 fd = open('/dev/err_led_dev', O_RDWR);
42 if(fd < 0){
43 printf('can't open /dev/err_led_dev n');
44 return -1;
45 }
46
47 if(strcmp(argv[1], 'on') == 0){
48 ioctl(fd, LED_ON);
49 }else if(strcmp(argv[1], 'off') == 0){
50 ioctl(fd, LED_OFF);
51 }else{
52 print_usage(argv[0]);
53 return -1;
54 }
55
56 return 0;
57 }
六.编译测试
步骤:
①加载err_led.ko
②加载kernel_rw.ko
③使用reg_editor应用程序读取 0x53fa4002 led灯引脚的数据
④使用err_led的应用程序熄灭led灯
⑤再次使用reg_editor应用程序读取 0x53fa4002 led灯引脚的数据
⑥使用reg_editor应用程序往0x53fa4000地址写入1000000,观察LED是否熄灭
⑥使用reg_editor应用程序往0x53fa4000地址写入0000000,观察LED是否点亮
1 //加载 kernel_rw.ko
2 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw# insmod kernel_rw.ko
3 kernel_rw_init
4 //读取地址 0x53fa4002的数据,由于此时灯是亮的,所以数据为0x05
5 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw# ./app/reg_editor r32 0x53fa4002
6 enter r32
7 00. [53fa4002] = 05
8 //熄灭led灯,也就是给led的引脚高电平
9 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw# ./err_gpio/app/err_led_test off
10 function open!
11 //再次 读取地址 0x53fa4002的数据,发现数据变为85了
12 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw# ./app/reg_editor r32 0x53fa4002
13 enter r32
14 00. [53fa4002] = 85
15 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw#
16
17 *********************************************************************
18 写地址:灭灯
19 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw# ./app/reg_editor w32 0x5
20 3fa4000 10000000
21 er w32, val = 989680 灯被熄灭
22
23 写地址:亮灯
24 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw# ./app/reg_editor w32 0x5
25 3fa4000 00000000
26 val = 0 写完后,发现IMX257板子的LED被点亮
27
28 root@EasyARM-iMX257 /mnt/nfs/module/38_debug_kernel_rw#
如图所示:
上一篇:调试分析之 修改内核来定位系统僵死问题
下一篇:调试分析之 根据内核报错信息栈信息分析错误
- 热门资源推荐
- 热门放大器推荐
- LT3088IDD 宽安全工作区电源的典型应用
- 使用 Analog Devices 的 LT3663IDCB-3.3 的参考设计
- ADR425 可编程 DAC 参考的典型应用
- LT4276BIUFD 25.5W(类型 2)PoE+ 电源在反激模式下的典型应用电路,具有 24V、1A 输出
- 具有浪涌电流限制的低待机损耗功率前端
- LT4275AHMS IEEE 802.3at(类型 2)25.5W 受电设备的典型应用电路
- 采用 MSP430 电容式触控 MCU、触觉元件和 LCD 的 MSP432 MCU 参考设计
- 具有 6uA 反向泄漏电流的 LT1767EMS8E-3.3 双源电源的典型应用电路
- DER-282 - 使用HiperLCSTM LCS700HG设计的100 W超薄 (11 mm) LLC DC-DC转换器
- UART转USB桥接器



非常经典的关于LLC的杨波博士论文
ADA4922-1ACPZ-R7

ASM10DTBD-S664






京公网安备 11010802033920号