龙芯3A3000-PMON
文章平均质量分 74
大智兄
嵌入式开发,讲师
展开
-
119.龙芯2k1000-pmon(18)-全自动安装linux系统
由它完成: /home/dazhi/program_pmon_ls2k1000 -e /home/dazhi/normal_env.bin就是把append再次还原再次启动,就会引导硬盘中的文件系统了。原创 2024-03-12 15:58:22 · 963 阅读 · 0 评论 -
118.龙芯2k1000-pmon(17)-制作ramdisk
目前手上这个设备装系统不容易,总是需要借助虚拟机才能实现。对生产就不太那么友好,能否不用虚拟机就能装Linux系统呢?主要是文件系统的问题需要解决,平时我们一般是用nfs挂载后,然后对硬盘格式化,之后再把文件系统解压到硬盘中,这个过程就必须借助虚拟机,而且还要求虚拟机的nfs和网络必须正常好用。这次我就想到了ramdisk,如果借助ramdisk,那么是否就可以脱离掉虚拟机,用几个命令是否就可以把系统装好呢?好,那么首先得有一个ramdisk才行。没有找到现成的,那就自己做吧。原创 2024-03-08 17:22:54 · 983 阅读 · 0 评论 -
117.龙芯2k1000-pmon(16)- linux下升级pmon
c gzrom-dtb.bin 比较flash中的与文件是否相同(只比较0-0xfb000这一段)tools/program-2k1000-pmon 目录下包含源码,还有编译出来的工具。-o gzrom-dtb-new.bin 读出flash中的程序(1m以内)-w gzrom-dtb.bin 直接写入gzrom-dtb.bin。我这做了一些选项 (修改dtb的部分没有实现,暂时好像没有这个需求)gzrom-dtb.bin 与-w的功能相同。-d dtb.bin 写入dtb。原创 2024-03-08 10:02:10 · 435 阅读 · 0 评论 -
116.龙芯2k1000-pmon(15)- 只修改env部分
既然前面已经研究了gzrom-dtb.bin的生成从这期开始,将研究如何通过linux下的app修改gzrom.bin在flash中的内容。本期第一步,既然要修改env的字节部分,那首先得有一个自己要有env.bin,所以就要想办法生成一个这个文件包含了自己想要的环境变量,但是又不想更新pmon的全部。这里有风险:会造成存档pmon与实际运行的内容不一致的情况!!!(先忽略)原创 2024-03-05 16:47:49 · 804 阅读 · 0 评论 -
115.龙芯2k1000-pmon(14)- pmon编程优化
通过上面的分析,发现,其实gzrom-dtb.bin其实有很多空白区域,而且空白区域填充的都是0,这对flash来说并不友好,能否把填充的位置改为ff呢,这样编程的速度也会加快,对flash来说也是一种保护呢。但是说实话,感觉烧写的速度并没有明显提高,我没有计时。python脚本改好了:(可能有bug)更新试试,能否启动?原创 2024-03-04 17:19:42 · 346 阅读 · 0 评论 -
114.龙芯2k1000-pmon(13)- 串口如何用
如果要使用dvo显示接口,那么最多只能有4个串口能用,即0,3,4,5。可以配置为4个串口的模式,那就是每个串口只有发送和接收引脚,不再支持流控这些了。看到串口1,和串口2的定义,意思是引脚复用了,但是并没有看到12个串口 啊!如果要使用12个串口,那么显示接口不可用,每个串口只有发送和接收引脚。全功能是8个引脚,但是只有uart0可用,uart3,4,5不可用。dvo 是显示引脚,如果要显示,那么串口1和串口2都无法使用!如果串口0要配置为4个串口,就是用功能5,默认应该就是功能3。原创 2024-03-02 09:59:44 · 523 阅读 · 0 评论 -
113.龙芯2k1000-pmon(12)- pmon源码对env的解析
本文回答前文思考的问题env写的位置是ff000 后面的500字节,这个位置能否改动呢?原创 2024-03-01 17:07:20 · 821 阅读 · 0 评论 -
112.龙芯2k1000-pmon(11)- gzrom-dtb.bin 文件的组成
最近又要折腾2k1000的设备了,研究了一下gzrom文件组成部分。pmon的编译可以参考之前的,这里我就不详述了gzrom-dtb.bin的生成命令在Makefile.inc(zloader.ls2k-hj20004目录)中截取出来如下:[ -存在gzrom.bin这个文件,复制这个文件为,相当于重命名了。2. python ../tools/pmonenv.py 用这个脚本来处理。(1.把dtb合并起来,2.加入一些环境变量)原创 2024-03-01 11:21:56 · 790 阅读 · 0 评论 -
龙芯2k1000-pmon(10)- _pci_businit---3(总结)
_setup_pcibuses(init);_pci_setup_windows空间分配,从大到小1. 空间的分配是由大到小的顺序。2. pci桥的mem空间都是分配1MB注意slot9 就是第一个桥的地址是0x4060,0000桥下设备分配的空间就是以这个为首地址。...原创 2022-03-21 16:56:10 · 650 阅读 · 0 评论 -
龙芯2k1000-pmon(8)- _pci_businit---1
这个部分没有分析过,先试试看,按照代码执行的顺序,现在应该是这个位置来了。1. 直入主题吧,tgt_devinit函数2._pci_businit (int init),init的参数值是1void_pci_businit (int init){ char *v; tgt_putchar('P'); v = getenv("pciverbose"); tgt_putchar('1'); if (v) { _pciverbose = atol(v);..原创 2022-03-16 16:38:34 · 728 阅读 · 0 评论 -
龙芯2k1000-pmon(9)- _pci_businit---2
1. 先根据下面的信息,画出了一个简单的示意图。 (应该是32个设备,0-31,图里写错了)2. 设备扫描打印的信息。(注:内部标注的中文不一定正确,因为我暂时也在摸索)setting up 1 bus2022-03-15 pci_roots = 12022-03-15 _pci_scan_dev bus = 0 device = 0 initialise = 1PCI bus 0 slot 0: probe...2222completedPCI bus 0 slot 1:..原创 2022-03-16 14:21:40 · 562 阅读 · 0 评论 -
龙芯2k1000-pmon(7)- pmon版本控制
昨天把pmon推到了github上,然后,今天突然发现了一点点小异常。突然这个名字被修改了 ,让我觉得眼前一亮啊。原来pmon背后还有点意思。因为这个提示在logo下面,这个就很容易找到了。(pmon/common/main.c)869行打印了logo884行的位置,对应有个Version:1. 好家伙,这个字符串vers来自全局变量。追查这个全局变量,来自vers.c文件,并且发现内容已经被修改好了。2. 那这个文件也是自动生成的。这里我看看编译脚本.原创 2022-03-11 15:49:11 · 583 阅读 · 0 评论 -
龙芯2k1000-pmon(6)- spiflash的底层操作
接着上篇环境变量的代码,想着继续深入一点。就是对flash的读写操作的一个解析。但是这里有几个必要的知识:(我可能没讲到很详细,大家可以自行百度没懂的部分)1. spi通信的原理。2. flash芯片手册,主要是命令的控制3. spi控制器的部分。1. 简要的介绍一下spi通信。我也参考百度吧。1.1 这几根连接线很重要,作用,必须有个了解。1.2 spi分主从,主就是控制端,从就是被控制端。一般单片机这端都是主,其他的设备都是从,比如flash芯片GD25Q64,这原创 2022-03-10 17:08:56 · 1672 阅读 · 1 评论 -
龙芯2k1000-pmon(8)- pmon编译的过程
这里主要讲的是make的一些简要的过程,没有分析makefile。依据是编译的提示信息。1. pmon文件的生成。pmon由ld链接生成,由以下这些文件链接而来的。共216个文件start.ocrtbegin.oparam.oioconf.ori.owdc.omainbus.opcibr.oif.oif_ethersubr.oif_loop.oif_media.oradix.oraw_cb.oraw_usrreq.oroute.ortsock.oi.原创 2022-03-10 15:44:34 · 785 阅读 · 0 评论 -
龙芯2k1000-pmon(7)- pmon编译时定义的宏
这些是由编译时确定的宏。每次都得找编译语句,记录一下。VGAROM_IN_BIOSLOONGSON_2KBOOT_PARAMVRAM_SIZE="0x10"SYSTYPE="\"FCR\""TARGETNAME="\"FCR\""LS2K_STRBONITOELDEVBD2EMIPSINETLS3_HTloongson3A3LSMC_2DDR3_DIMMLOONGSON_GMACDTBINTERFACE_3A780ECONS_BAUD="B115200".原创 2022-03-10 14:01:23 · 266 阅读 · 0 评论 -
龙芯2k1000-pmon(5)- pmon无法修改环境变量的问题
这是在用的时候想改变环境变量,但是莫名的除了问题,这篇来追查这个问题的原因。1. 错误的样式新增似乎,是没有问题,但是修改原有环境变量的值,就变成了全ff这里是用al1举例说明的。再次重启之后,环境变量就不可用了。1.1 但是先删除后加入,就不会有问题重启之后,环境变量确实是更新了。2. 源代码保留一份吧,方便以后查找问题int tgt_setenv(char *name, char *value){ char *ep; int envlen; char原创 2022-03-08 22:15:00 · 702 阅读 · 0 评论 -
龙芯2k1000-pmon(4)- pmon设置默认ip地址
这是我上一节的一个想法,就是想给pmon自动设置一个IP设置在makefile的命令行上,这样就给syn1网卡设置了一个IP重启之后,发现确实就是这样的。设置ip成功了!!!!在看代码的时候看到的,其实系统初始化了网卡看到代码中确实有去获取这样一个环境变量。...原创 2022-03-07 18:23:00 · 1279 阅读 · 0 评论 -
龙芯2k1000-pmon(3)- 为什么有些命令看不到简介
这篇是龙芯2k1000-pmon(1)的后续,我在使用命令的时候,发现有些命令并没有显示出来:比如ifconfig我用这个命令设置ip地址可以,但是如果是第一次接触的话,根本看不到这个命令。那我就想为什么有些命令有,但是看不到呢?这不是(对初次接触的人)有些不方便么。其实我还有个问题,就是想在pmon的环境变量中设置一个ip,它启动后,就有自己的IP这样就能够自动从tftp下载内核去引导了。至少我的参数就可以设置为tftp加载方式。但是没有ip,还是行不通。初次接触,就是要走很多弯路..原创 2022-03-07 17:01:25 · 729 阅读 · 0 评论 -
龙芯2k1000-pmon(2)- envinit函数注释学习
这是第二篇了,感觉顺序还是很重要,那我稍微整理说明一下。我的顺序是从main.c(pmon/common/main.c) 813行左右void dbginit (char *adr) 函数开始的。至于为什么,因为前面看了一截,又没有写笔记,所以就从这开始呗,后面再追加一下前面的部分吧。第一篇讲的就是__init函数的执行部分。(还不完整)第二篇,就是这篇,那就envinit吧,一、这是环境变量初始化函数。extern void get_ec_version(void);/*原创 2022-03-04 21:15:00 · 942 阅读 · 0 评论 -
龙芯2k1000-pmon(1)- cmdlist_expand(newcmdlist, atend)函数注释学习
cmdtable.c (pmon/cmds/)这个函数是填充CmdList这个数组的,这个数组中存放的是指针,确切的说是函数指针。函数的实现是如何将命令存储到数组中。const Cmd *CmdList[100];voidcmdlist_expand(newcmdlist, atend) const Cmd *newcmdlist; int atend;{ int i; for(i = 0; i < 100; i++) { if(CmdList[i] ==原创 2022-03-03 20:00:00 · 352 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(30)撸起袖子干-再来一杯代码11-内存初始化3-mc_init
这部分留给mc_init(这可能是个大话题。)1. 这个函数被调用了两次,参数t3分别是0和1mc_init: move t7, ra //保存返回值,可能中间要调用其他函数 sync nop nop nop nop //t0 = 0x900000003ff00000 两个偏移都是0x10??,配置了同一个窗口?? GET_NODE_ID_a0; //a0=0;s1也传过来了,参数OFFSET,BASE,MA原创 2021-07-31 14:57:30 · 686 阅读 · 2 评论 -
单龙芯3A3000-7A1000PMON研究学习-(29)撸起袖子干-再来一杯代码10-内存初始化2
接着上篇的代码来。1.上代码 PRINTSTR("PCI space open: 0x80000000 - 0x8FFFFFFF\r\n") //打印信息//config high memory windows GET_MC_SEL_BITS beqz a1, 84f //不跳转 nop/* Assume MC0_ONLY */ GET_MC0_MEMSIZE //a1 = 16 move t5, a1 G原创 2021-07-31 09:36:35 · 234 阅读 · 1 评论 -
单龙芯3A3000-7A1000PMON研究学习-(28)撸起袖子干-再来一杯代码10-内存初始化1
1.上篇的一个尾巴,不解释了8: TTYDBG("LS3A-7A linkup.") //HT链接建立//setup LS3A - 7A HT link done. bal beep_off nop2.正式开始,继续读代码 TTYDBG("\r\nStart Init Memory, wait a while......\r\n") //内存控制器初始化####################################.原创 2021-07-30 17:07:25 · 761 阅读 · 2 评论 -
单龙芯3A3000-7A1000PMON研究学习-(27)撸起袖子干-再来一杯代码9-reset_ht_link
1.回到start.S,继续 move a1, t2 //t2的值在691行赋值(当前793行) bal reset_ht_link //返回值不为0,表示有错误发生 nop li a0, 0xf3f3 and a0, a0, v0 beqz a0, 8f nop move t8, v0 TTYDBG("!!!LS3A-7A link error occur. E原创 2021-07-29 17:17:51 · 540 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(26)撸起袖子干-再来一杯代码8
1.继续往下执行config_ht_link 在 ls3a7a_setup_ht_link.S 文件的前半部分:1.1 先看这个文件的注释吧//************************************// setup_ht_link// author: chenxk// date: 2017.11.14// set up the link between CPU and PCH include two steps: 设置这个连接包括两个步骤// 1. confi..原创 2021-07-29 16:19:48 · 503 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(25)撸起袖子干-再来一杯代码7
1.继续看下面的代码吧//setup LS3A - 7A HT link start... //check 3A clksel setting li t0, 0xbfe00190 //物理地址1fe00190,3A低速设备地址 lw a0, 0x4(t0) srl a0, a0, 15 beqz a0, 3f /* 正常是跳转 是等于0*/ nop#ifdef CHECK_HT_PLL_MODE原创 2021-07-29 11:48:23 · 309 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(24)撸起袖子干-准备工作6
1.打印一下,PMON的启动信息。可能与我分析的PMON有少量调整。里面有一部分是我做了一些记录,分析代码的时候结合这个打印信息,还是能够快速找到一些可疑点的,因为有些条件编译,或者一些值不确定。以下信息仅供参考。NOT Shut down slave coresPMON2000 MIPS Initializing. Standby…0xbfe00190 : 000041ef00b8b6b6NOT Shut down slave coresPMON200...原创 2021-07-29 10:27:04 · 1308 阅读 · 4 评论 -
单龙芯3A3000-7A1000PMON研究学习-(23)撸起袖子干-分析代码前的准备工作5
从PMON的手册可以看出来,我的代码分析的步骤已经如下图示了。这部分代码不多,功能也不复杂。请多结合文档反复查看。针对上面提到的功能,请仔细回顾。后面的路还很长很长。。。。。。。。。。。。加油就是了。。。。。。。...原创 2021-07-29 10:10:42 · 172 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(22)撸起袖子干-再来一杯代码6
1.继续之前的代码部分 //config fix address bar for Misc devices block dli t0, MISC_HEADER_ADDR //0xfdfe00,1000 --> ,0x1000地址位的bit[15:11]依次对应设备号为2、[10:8]func号 [7:0]表示偏移 li t1, MISC_BASE_ADDR //0x1008,0000,起始地址 sw t1, 0x10(t0原创 2021-07-28 19:28:12 · 217 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(21)撸起袖子干-再来一杯代码5
1.又来包含一个loongson3_ht1_32addr_trans.S文件 TTYDBG("32 bit PCI space translate to 64 bit HT space\r\n")#include "loongson3_ht1_32addr_trans.S"2. 代码不长,把执行的部分复制出来。 dli t0, 0x900000003ff02000 //CORE0_WIN0_BASE daddu t2, t0, 0x800 ...原创 2021-07-28 17:16:14 · 237 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(20)撸起袖子干-再来一杯代码4
1.接着上次的代码往下看这一段就是要使能cache,加快指令的执行。/* * Reset and initialize l1 caches to a known state. */ ## enable kseg0 cachablilty#### mfc0 t6, CP0_CONFIG //$16 ori t6, t6, 7 xori t6, t6, 4 /* 这两条指令得到低三位的值011b,设置kseg0 cache属性 */.原创 2021-07-28 16:44:48 · 180 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(19)撸起袖子干-再来一杯代码3
1.start.S包含一个独立的pcitlb.S文件########################################## PRINTSTR("NO TLB cache init ...\r\n")#include "pcitlb.S" /* map 0x4000000-0x7fffffff(物理地址) to 0xc0000000 (虚拟地址)*/1.1 这个文件的内容不长,意思也比较简单/*smh : pcitlb.S used to map...原创 2021-07-28 16:15:05 · 331 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(18)撸起袖子干-再来一杯代码2
1. 接上次的代码吧。locate: la s0, start //得到start链接的地址,即内存中的地址 subu s0, ra, s0 //ra是返回地址,在rom中,比start大,相减,得到实际的差值 and s0, 0xffff0000 //64K字节对齐,得到的是差值,S0 这个值很重要 li t0,SR_BOOT_EXC_VEC //[22]为1,其他位为0 mtc0 t0,COP_0_STATUS_REG //$12 [22] 1 设置BEV,使用原创 2021-07-27 16:39:35 · 600 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(17)撸起袖子干-分析代码前的准备工作4-地址映射
1.地址映射是搞得我最懵逼的地方,我也不知道我现在看懂没,先写上吧,有错误再改。地址映射涉及到访问内存,访问外设(寄存器)啊。。。。不搞清楚,真的是程序看不懂。2.首先物理地址吧。声明一下,龙芯3A3000启动就是使用虚拟地址。2.1 上图《user1.pdf》这个图片显示龙芯支持48位地址,但是实际只用了44位(单芯片的情况下)44位能访问的空间也是足够大了,16PB3.虚拟地址,这必须要用啊。...原创 2021-07-26 20:31:20 · 756 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(16)撸起袖子干-分析代码前的准备工作3-寄存器
1.这篇还是稍微介绍一下cpu相关的寄存器。手册里面说到的寄存器分两种,一种是cpu使用的(汇编中用来存放数据的),另一种是外部设备寄存器(一般用于配置功能,或者读写外部设备数据用的。),在手册中都叫寄存器,但是两种有较大区别,这里要讲的是cpu使用的寄存器,他们的作用相当于你吃饭的筷子和碗,没得筷子和碗,你就没法吃饭。cpu也是,没得寄存器,没法计算和运行啦。2.龙芯寄存器,这是定点数寄存器,共32个,每个64位,而且有一些有特定功能。 REGISTER N原创 2021-07-23 16:06:20 · 592 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(15)撸起袖子干-先来一杯代码吧
1.扭扭捏捏,准备工作都是一大堆,要不来点汇编开开胃原创 2021-07-22 10:33:53 · 602 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(14)撸起袖子干-分析代码前的准备工作2
1.我细细回想一下,感觉要准备的东西很多。比如体系结构,汇编指令,地址映射,外设。。。。然而,光体系结构就复杂到要用n页(官方的)pdf才能说清楚(其实不一定能说清楚,可能还得慢慢去琢磨)。这里还要牵扯到mips的一些问题。唉,路漫漫其修远兮。。。。。2.我想还是先列一下参考文档吧。不一定全,但是我基本都翻了翻。2.1《Loongson3A3000_3B3000user1.pdf》2.2 《Loongson3A3000_3B3000user2.pdf》 //很多协处理器...原创 2021-07-21 17:27:33 · 313 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(13)撸起袖子干-make的过程
1.千言万语的分析,不如把make的过程打印出来。图片中可以看到一些步骤。1.1 做了clean的操作1.2 第2行,start.o删除1.3 第3行,生成ld.scripts脚本1.4 第4行,进入/Targets/Bonito3a3000_7a/compile/Bonito/,执行makefile(就是cfg自动生成的那个)1.5 第6-10行,应该很眼熟了吧。按照给定的顺序开始编译了。start.S...1.6 425行和427行,是不是也是...原创 2021-07-21 14:21:05 · 616 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(12)撸起袖子干-分析代码前的准备工作1
1.make的过程我说了个大概,大家可以参考一下前面的文章。现在准备分析代码吧,其实这个准备工作内容应该蛮多的。可能后面还要补充。2.首先找到关键的bin文件啊,就是可以最终下载到flash,能启动的镜像。(没更新过,但是还是得知道是更新谁吧)官网上找,看了所有得更新方法,都是把gzrom.bin下载到flash中。那不用怀疑,就是它了。3.其实我们得Makefile中已经有,而且是可以正确编译出这个bin文件的。这就是我们最终需要的文件。由rom这个目标生成的。..原创 2021-07-21 11:00:27 · 285 阅读 · 0 评论 -
单龙芯3A3000-7A1000PMON研究学习-(11)撸起袖子干-make tgt=rom的编译过程
1. 今天来分析一下makefile,看看如何编译出执行文件pmon的。先贴几张图,makefile的内容,这是一些依赖关系图一 图二图三图四图五2.图一解释rom这个目标又三个依赖,clean,$START,zloader.o先执行依赖,再去执行后面的命令。clean这个目标就不解释了吧,反正就是删除。。。。(图二)3.图三,start.o是如何生成的?3.1首先删除原来的start.o3.2 生成链接脚本ld....原创 2021-07-20 14:44:45 · 236 阅读 · 2 评论