GNU C中嵌入汇编添加一个自定义uboot命令
2017-08-05 18:58
169 查看
二话没用,直接上代码:
#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"
);
#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"
);
相关文章推荐
- linux一条命令添加一个root级别账户并设置密码
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 初识linux chmod命令/函数时我就产生一个有趣疑问:既然chmod可以改变权限, 那即使某用户原来没有某文件的权限, 也可以自己添加权限啊!
- 在Orchard中为命令行工具(Command-Line)添加一个新命令
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(Linux)
- 汇编练习2:用一个根据年月日计算发生天数的程序练习参数传递和对基础命令的认识
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 初学 Delphi 嵌入汇编[14] - 常量与变量在汇编中的一个区别
- 教你在Linux中如何用命令或手动修改文件来添加一个用户
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
- 记录在linux的/bin/目录下添加一个带有软连接的命令
- 库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 第4节 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用【Linux内核分析】
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用