龙芯qemu使用

龙芯qemu使用

以龙芯ls2k1000 处理器为例,用qemu启动pmon和内核

1、获取qemu

git clone  https://gitee.com/martinqiao/qemu.git

然后执行:

cd qemu
mkdir build
cd build/
../configure --t	arget-list=mipsel-softmmu,mips64el-softmmu --disable-werror
make

2、qemu启动pmon

./mips64el-softmmu/qemu-system-mips64el -M ls2k -m 256  -smp 1  -serial stdio -bios /home/tftpboot/gzrom.bin

3、qemu启动kernel

创建执行脚本boot.sh,内容如下:

#!/bin/bash

#QVER=loongson-v1.0
#Based on v3.10
#KVER=loongnix-release-1903
#RVER=2016.05
#Minimal memory for boot is 256M, but with graphic, 1024M is required
MEM=1024M

#maxcpus=1 must be passed to not hang at booting
#Booting CPU#1...
#[    0.150000] CPU#1, func_pc=ffffffff80da1c7c, sp=980000000c0f3eb0, gp=980000000c0f0000
#[    0.256000] random: fast init done

#Graphic boot or not, 1 for graphic, 0 for serial
G=0
if [ $G -eq 1 ]; then
  CONSOLE=tty0
  GOPT=
else
  GOPT=-nographic
  CONSOLE=ttyS0
fi

./mips64el-softmmu/qemu-system-mips64el -M ls2k -m $MEM -smp 1 -no-reboot $GOPT \
	-bios	./gzrom.bin \
	-kernel	/home/tftpboot/vmlinuz \
	-initrd	/home/tftpboot/initrd-2k.gz \
	-dtb  	/home/tftpboot/LS2K.dtb \
	-append "root=/dev/ram0 console=$CONSOLE maxcpus=1" \
#-device usb-mouse -device usb-kbd -show-cursor \
	#-net nic,model=synopgmac -net tap

参数说明
-h:帮助
-version:查看版本
-M:指定开发板
-m:指定内存大小
-smp:cpu个数
-kernel:指定内核文件
-dtb:指定dtb文件
-nographic:指定不需要图形界面
-initrd file:使用“file"作为初始化的RAM磁盘
-append:cmdline内核命令行
-serial=serial:给设备指定序列号(可能是串口,也可能和串口无关)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
龙芯系统的GPIO是通过内存映射IO方式实现的,需要使用相应的操作系统接口进行访问。以下是使用Linux系统中C语言访问GPIO的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/mman.h> #define GPIO_BASE 0x1F02B000 // GPIO控制器的物理地址 #define GPIO_SIZE 0x1000 // GPIO控制器的大小 #define GPIO_PIN_INPUT 0 // GPIO输入模式 #define GPIO_PIN_OUTPUT 1 // GPIO输出模式 // 映射到用户空间的内存指针 volatile unsigned int* gpio; // 初始化GPIO int init_gpio() { int mem_fd; void* gpio_map; // 以只读方式打开/dev/mem if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0) { perror("open /dev/mem failed"); return -1; } // 映射GPIO控制器的内存区域到用户空间 gpio_map = mmap(NULL, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO_BASE); close(mem_fd); if (gpio_map == MAP_FAILED) { perror("mmap failed"); return -1; } // 将映射到用户空间的指针转换为虚拟地址 gpio = (volatile unsigned int*)gpio_map; return 0; } // 设置GPIO的工作模式 void set_gpio_mode(int pin, int mode) { int bank = pin / 32; int offset = pin % 32; // 将GPIO对应的寄存器偏移量计算出来 unsigned int reg_offset = bank * 8 + offset / 16 * 4; unsigned int reg_mask = ~(0x7 << ((offset % 16) * 3)); unsigned int reg_value = mode << ((offset % 16) * 3); // 设置GPIO对应的工作模式 gpio[reg_offset / 4] = (gpio[reg_offset / 4] & reg_mask) | reg_value; } // 设置GPIO输出状态 void set_gpio_output(int pin, int value) { int bank = pin / 32; int offset = pin % 32; // 将GPIO对应的寄存器偏移量计算出来 unsigned int reg_offset = bank * 8 + 0x10; unsigned int reg_mask = ~(1 << offset); unsigned int reg_value = value << offset; // 设置GPIO的输出状态 gpio[reg_offset / 4] = (gpio[reg_offset / 4] & reg_mask) | reg_value; } // 获取GPIO输入状态 int get_gpio_input(int pin) { int bank = pin / 32; int offset = pin % 32; // 将GPIO对应的寄存器偏移量计算出来 unsigned int reg_offset = bank * 8 + 0x14; // 返回GPIO的输入状态 return (gpio[reg_offset / 4] >> offset) & 0x1; } int main() { int gpio_pin = 0; // 初始化GPIO if (init_gpio() < 0) { printf("init gpio failed\n"); return -1; } // 设置GPIO为输出模式 set_gpio_mode(gpio_pin, GPIO_PIN_OUTPUT); // 循环设置GPIO输出状态 while (1) { set_gpio_output(gpio_pin, 1); usleep(500000); set_gpio_output(gpio_pin, 0); usleep(500000); } return 0; } ``` 在以上代码中,使用mmap函数将GPIO控制器的物理地址映射到用户空间,然后通过读写对应的寄存器来控制GPIO的输入输出状态。需要注意的是,GPIO的使用需要root权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大、猫

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值