GNU C中嵌入汇编添加一个自定义uboot命令
来源:互联网 发布:网络嗅探器5.5 编辑:程序博客网 时间:2024/06/07 21:49
二话没用,直接上代码:
#include <common.h>#include <command.h>/*static inline int __raw_readsb(unsigned int addr, void *data, int bytelen){__asm__ __volatile__ ("1:ld.dir8, [r0]\n""sub.fr2, r2, 1\n""bnz.d1b\n""stb.abr8, [r1, 1]\n":: "r" (addr), "r" (data), "r" (bytelen): "r8");return bytelen;}static int disable_interrupts (void){ unsigned long old,temp; __asm__ __volatile__("mrs %0, cpsr\n" "orr %1, %0, #0x80\n" "msr cpsr_c, %1" : "=r" (old), "=r" (temp) : : "memory"); return (old & 0x80) == 0;}*/static void show_cache_state(void){unsigned long state;__asm__ volatile ("MRC p15, 0,%0, c1, c0, 0\n\r": "=r" (state):: "memory" );printf(" register SCTLR value: %lx \n", state );if(state & (0x01<<12)) {printf("Icache : ON\n");} else {printf("Icache : OFF\n");}if(state & (0x01<<2)) {printf("Dcache : ON\n");} else {printf("Icache : OFF\n");}}U_BOOT_CMD(nu_cache, 1, 0, show_cache_state,"show Icache and Dcache state","nu_cache [args...]\n");static void do_set_cache(unsigned int icase){unsigned long value,state;__asm__ volatile ("MRC p15, 0,%0, c1, c0, 0\n\r": "=r" (state):: "memory" );printf(" register SCTLR old value: %lx \n", state );switch (icase) {case 1:value = state & ~(0x01<<2);break;case 2:value = state | (0x01<<2);break;case 3:value = state & ~(0x01<<12);break;case 4:value = state | (0x01<<12);break;default:value = state;break;}printf(" the value will write to is: %#lx \n", value );__asm__ volatile ("MCR p15, 0,%0, c1, c0, 0\n\r": : "r" (value): "memory" );__asm__ volatile ("MRC p15, 0,%0, c1, c0, 0\n\r": "=r" (state):: "memory" );printf(" register SCTLR new value: %lx \n", state );}static int set_cache(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]){if(argc < 3) {printf("args eeror\n");return -1 ;}if( strcmp(argv[1],"-D")==0 ) {printf("set Dcache:");if( strcmp(argv[2],"0")==0 ) {do_set_cache(1);} else if( strcmp(argv[2],"1")==0 ) {do_set_cache(2);} else {printf("argv[2] must is 0 or 1 \n");return -1 ;}printf("\n");}else if( strcmp(argv[1],"-I")==0 ) {printf("set Icache:");if( strcmp(argv[2],"0")==0 ) {do_set_cache(3);} else if( strcmp(argv[2],"1")==0 ) {do_set_cache(4);} else {printf("argv[2] must is 0 or 1 \n");return -1 ;}printf("\n");}else {printf("argv[1] must be -D or -I\n");return -1;}return 0;}U_BOOT_CMD(nu_cache_set, 3, 2, set_cache,"set Icache and Dcache ","nu_cache_set [options]\n");
阅读全文
0 0
- GNU C中嵌入汇编添加一个自定义uboot命令
- 在UBOOT中添加自定义命令
- 添加一个uboot命令
- linux c 中嵌入汇编
- C语言中嵌入汇编
- C语言中嵌入汇编
- linux c 中嵌入汇编
- C语言中嵌入汇编
- c/c++中嵌入汇编
- 在C/C++中嵌入汇编(一)
- 在C/C++中嵌入汇编(二)
- 在c/c++ 中嵌入汇编 (三)
- 在c代码中嵌入汇编
- C语言中嵌入汇编代码
- C/C++中如何嵌入汇编
- IAR 下C中嵌入汇编
- 添加一个uboot命令的方法
- UBOOT命令怎么自己添加 嵌入式汇编控制cpu CACH
- GNU工具-gperf详解(完美哈希函数生成器)
- JavaScript运算符(操作符)详解(1)----基本运算符
- Android 四大组件之 Service (上)
- Codeforces 837D Round Subset【思维+Dp+滚动数组】
- JS实现继承的几种方式
- GNU C中嵌入汇编添加一个自定义uboot命令
- opencv常见函数
- Java8 Lambda语法 示例
- serializer嵌套序列化
- Counting Divisors (2017 多校4)“素 数 筛”
- 数据结构之二叉树
- uva1600-Patrol Robot(bfs)
- LeetCode 474. Ones and Zeroes 动态规划解法+拓展
- Socket抽象类的工程应用