龙芯俱乐部开源社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 693|回复: 8

start.S点亮LED

[复制链接]

5

主题

16

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
发表于 2019-6-30 13:09:12 | 显示全部楼层 |阅读模式
大家好,我参考了白菜板和u-boot的启动代码,想在start.S里点亮LED,但是没成功。我用的是智龙开发板V2.1。搞了很长时间,实在不知道什么原因,请大家帮帮我。


这是我的start.S文件:
  1. #include <asm/regdef.h>
  2. #include <asm/mipsregs.h>
  3. #define SR_BOOT_EXC_VEC                0x00400000
  4. #define LS1X_SPI_SFC_PARAM        0x1b

  5. #define SDRAM_DIV_2                0x0
  6. #define PLL_MULT                0x54                /* CPU LCD CAM及外设倍频 */
  7. #define SDRAM_DIV                SDRAM_DIV_2        /* LS1C的SDRAM分频 */
  8. #define CPU_DIV                2                        /* LS1C的CPU分频 */
  9. #define PLL_FREQ                (0x80000008 | (PLL_MULT << 8) | (0x3 << 2) | SDRAM_DIV)
  10. #define PLL_DIV                (0x00008003 | (CPU_DIV << 8))
  11. /* Delay macro */
  12. #define DELAY(count)        \
  13.         li                t2, count;        \
  14. 99:                                                \
  15.         nop;                                \
  16.         subu        t2, 0x1;        \
  17.         bnez        t2, 99b;        \
  18.         nop

  19.         .set noreorder

  20.         .globl _start
  21.         .text

  22. _start:
  23.         b        reset
  24.         nop

  25. reset:
  26.         /* Clear watch registers,这一步是否必需? */
  27.         mtc0        zero, CP0_WATCHLO
  28.         mtc0        zero, CP0_WATCHHI

  29.         mtc0        zero, CP0_STATUS  // 清零cp0 status寄存器 $12
  30.         mtc0        zero, CP0_CAUSE   // 清零cp0 cause寄存器 $13

  31.         /*
  32.     设置启动异常向量入口地址为ROM地址(0xbfc00000)
  33.     将寄存器cp0 status的BEV置1,使CPU采用ROM(kseg1)空间的异常入口点
  34.     */
  35.         li        t0, SR_BOOT_EXC_VEC        /* Exception to Boostrap Location */
  36.         mtc0        t0, CP0_STATUS

  37.         /* initialize spi */
  38.         li  t0, 0xbfe80000      //地址0xbfe80000为SPI0的寄存器基地址
  39.         li  t1, 0x1b
  40.         //li  t1, 0x17                // div 4, fast_read + burst_en + memory_en double I/O 模式 部分SPI flash可能不支持
  41.         sb  t1, 0x4(t0)                // 设置寄存器sfc_param
  42.         li  t1, 0x05
  43.         sb  t1, 0x6(t0)         // 设置寄存器sfc_timing
  44.        

  45.         /* config pll div for cpu and sdram */
  46.         li        t0, 0xbfe78030
  47.         /* 设置PLL倍频 及SDRAM分频 */
  48.         li        t2, PLL_FREQ
  49.         /* 设置CPU分频 */
  50.         li        t3, PLL_DIV
  51.         /* 注意:首先需要把分频使能位清零 */
  52.         li        t1, 0x2
  53.         sw        t1, 0x4(t0)
  54.         sw        t2, 0x0(t0)
  55.         sw        t3, 0x4(t0)
  56.         DELAY(4096)
  57.        
  58.         // 尝试点亮LED
  59.         // LED5 CMADATA0 GPIO050, 在GPIO1这个组里。这个是我看电路图猜的,不知道对不对?
  60.         li a0, 0xbfd00000
  61.         li t1, 0xffffffff
  62.         sw t1, 0x10c4(a0)    // 配置寄存器,1表示不复用,即普通的GPIO
  63.        
  64.         li t0, 0x0
  65.         sw t0, 0x10d4(a0)    // 使能寄存器 0表示配置为输出



  66. blink:
  67.         li t0, 0xffffffff
  68.         sw t0, 0x10f4(a0)    // 输出寄存器 1表示输出高电平
  69.         DELAY(50000)
  70.        
  71.         li t0, 0x0
  72.         sw t0, 0x10f4(a0)    // 输出寄存器 0表示输出低电平
  73.         DELAY(50000)
  74.         b blink
  75.         nop
复制代码



编译和链接的指令我是从u-boot里拷贝的,为了方便编译,我写了一个简单的Makefile:

  1. start.o:
  2.         echo "compiling u-boot..."
  3.         mipsel-linux-gcc   -D__ASSEMBLY__ -g  -Os   -ffunction-sections -fdata-sections -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0xbfc00000 -I/mnt/hgfs/CentOS_Share/trystart -fno-builtin -ffreestanding -nostdinc -isystem /opt/gcc-4.3-ls232/bin/../lib/gcc/mipsel-linux/4.3.0/include -pipe  -DCONFIG_MIPS -D__MIPS__ -G 0 -mabicalls -fpic -EL -msoft-float -march=mips32 -mabi=32 -DCONFIG_32BIT   -o start.o start.S -c
  4.         echo "echo "linking u-boot...""
  5.         mipsel-linux-ld  -G 0 -static -n -nostdlib -EL -m elf32ltsmip -T u-boot.lds --gc-sections -pie -Bstatic -Ttext 0xbfc00000 start.o -L /opt/gcc-4.3-ls232/bin/../lib/gcc/mipsel-linux/4.3.0 -lgcc -Map u-boot.map -o u-boot
  6.         echo "generating u-boot.bin..."
  7.         mipsel-linux-objcopy --remove-section=.dynsym --gap-fill=0xff -O binary u-boot u-boot.bin
  8.         echo "done!"

  9. .PHONY : clean

  10. clean:
  11.         rm -f start.o u-boot u-boot.map u-boot.bin
复制代码


本来不准备使用链接脚本的,但是不使用链接脚本,会填充很多无用的数据,导致.bin文件非常大。链接脚本就是移植好的原生的u-boot.lds。
这个移植好的u-boot我试过,烧到板子里是可以跑起来的。

u-boot.lds:
  1. /*
  2. * (C) Copyright 2003
  3. * Wolfgang Denk Engineering, <wd@denx.de>
  4. *
  5. * SPDX-License-Identifier:        GPL-2.0+
  6. */



  7. OUTPUT_ARCH(mips)
  8. ENTRY(_start)
  9. SECTIONS
  10. {
  11.         . = 0x00000000;

  12.         . = ALIGN(4);
  13.         .text : {
  14.                 *(.text*)
  15.         }

  16.         . = ALIGN(4);
  17.         .rodata : {
  18.                 *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
  19.         }

  20.         . = ALIGN(4);
  21.         .data : {
  22.                 *(.data*)
  23.         }

  24.         . = .;
  25.         _gp = ALIGN(16) + 0x7ff0;

  26.         .got : {
  27.                 *(.got)
  28.         }

  29.         num_got_entries = SIZEOF(.got) >> 2;

  30.         . = ALIGN(4);
  31.         .sdata : {
  32.                 *(.sdata*)
  33.         }

  34.         . = ALIGN(4);
  35.         .u_boot_list : {
  36.                 KEEP(*(SORT(.u_boot_list*)));
  37.         }

  38.         . = ALIGN(4);
  39.         __image_copy_end = .;

  40.         .rel.dyn : {
  41.                 __rel_dyn_start = .;
  42.                 *(.rel.dyn)
  43.                 __rel_dyn_end = .;
  44.         }

  45.         .deadcode : {
  46.                 /*
  47.                  * Workaround for a binutils feature (or bug?).
  48.                  *
  49.                  * The GNU ld from binutils puts the dynamic relocation
  50.                  * entries into the .rel.dyn section. Sometimes it
  51.                  * allocates more dynamic relocation entries than it needs
  52.                  * and the unused slots are set to R_MIPS_NONE entries.
  53.                  *
  54.                  * However the size of the .rel.dyn section in the ELF
  55.                  * section header does not cover the unused entries, so
  56.                  * objcopy removes those during stripping.
  57.                  *
  58.                  * Create a small section here to avoid that.
  59.                  */
  60.                 LONG(0xffffffff);
  61.         }

  62.         .dynsym : {
  63.                 *(.dynsym)
  64.         }

  65.         .bss __rel_dyn_start (OVERLAY) : {
  66.                 __bss_start = .;
  67.                 *(.sbss.*)
  68.                 *(.bss.*)
  69.                 *(COMMON)
  70.                 . = ALIGN(4);
  71.                 __bss_end = .;
  72.         }

  73.         /DISCARD/ : {
  74.                 *(.dynbss)
  75.                 *(.dynstr)
  76.                 *(.dynamic)
  77.                 *(.interp)
  78.                 *(.hash)
  79.                 *(.gnu.*)
  80.                 *(.plt)
  81.                 *(.got.plt)
  82.                 *(.rel.plt)
  83.         }
  84. }
复制代码



5

主题

16

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
 楼主| 发表于 2019-6-30 13:27:19 | 显示全部楼层
不知道是我GPIO没找对,还是哪地方写错了。上电后没反应。项目文件我放在附件里了,实在不知道哪里错了,请大牛指点一下。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

40

主题

102

帖子

3617

积分

论坛元老

Rank: 8Rank: 8

积分
3617
发表于 2019-6-30 21:05:43 | 显示全部楼层
可以先串口連接智龍試一下gpio是否找對了。
#!/bin/sh
echo "test"
echo 52 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio52/direction
while true
do
    echo 0 > /sys/class/gpio/gpio52/value
    sleep 0.1
    echo 1 > /sys/class/gpio/gpio52/value
    sleep 0.1
done

5

主题

16

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
 楼主| 发表于 2019-6-30 21:22:10 | 显示全部楼层
cyberhero 发表于 2019-6-30 21:05
可以先串口連接智龍試一下gpio是否找對了。
#!/bin/sh
echo "test"

我是看电路图找的。CAMDATA0,110管脚,查了用户手册是GPIO050。

我已经把pmon擦除了,没办法用串口试了。

5

主题

16

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
 楼主| 发表于 2019-7-2 22:21:54 | 显示全部楼层
找到原因了,低电平是点亮。还要注意li和lw的区别。。

40

主题

102

帖子

3617

积分

论坛元老

Rank: 8Rank: 8

积分
3617
发表于 2019-7-3 20:44:48 | 显示全部楼层
有時間可以寫個詳細的教程

5

主题

16

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
 楼主| 发表于 2019-7-3 23:12:17 | 显示全部楼层
cyberhero 发表于 2019-7-3 20:44
有時間可以寫個詳細的教程

正在做了

55

主题

379

帖子

43万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
437801
发表于 2019-7-10 17:01:42 | 显示全部楼层

发些图片吧

5

主题

16

帖子

1261

积分

金牌会员

Rank: 6Rank: 6

积分
1261
 楼主| 发表于 2019-7-15 19:35:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|龙芯俱乐部开源社区  

GMT+8, 2020-4-4 20:17 , Processed in 0.248197 second(s), 44 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表