调试分析之 自制工具<寄存器编辑器>

发布者:CrystalClear最新更新时间:2024-08-13 来源: cnblogs关键字:调试分析  自制工具 手机看文章 扫描二维码
随时随地手机看文章

 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# 


如图所示:


ddf4aea30717bf59c944c98d748f2202_PkRu+qAAAAAElFTkSuQmCC.png?imageView2/2/w/1000

[1] [2] [3]
关键字:调试分析  自制工具 引用地址:调试分析之 自制工具<寄存器编辑器>

上一篇:调试分析之 修改内核来定位系统僵死问题
下一篇:调试分析之 根据内核报错信息栈信息分析错误

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved