订阅
纠错
加入自媒体

如何从0编译和移植uboot、增加串口?

2021-04-01 14:59
一口Linux
关注

c) 添加串口初始化代码:在uart_asm_init: 的

351     str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]

后添加

ldr r0, =0x10030000
ldr r1, =0x666666  
ldr r2, =CLK_SRC_PERIL0_OFFSET
str r1, [r0, r2]
ldr r1, =0x777777
ldr r2, =CLK_DIV_PERIL0_OFFSET
str r1, [r0, r2]

d) 注释掉trustzone初始化注释掉

104     bl uart_asm_init

下的代码:

#if 0
   bl tzpc_init
#endif
5. 网卡移植

因为各个厂家使用的网卡不尽相同,所以三星公司提供的驱动程序只预留了网卡初始化的函数入口,针对不同的板子,我们需要针对电路自己移植网卡的驱动。网卡的驱动详解,我们会在后一章节详细讲解。

1、 添加网络初始化代码

$ vim   board/samsung/origen/origen.c

31 struct exynos4_gpio_part2 *gpio2;

后添加:

#ifdef CONFIG_DRIVER_DM9000
#define EXYNOS4412_SROMC_BASE 0X12570000
#define DM9000_Tacs     (0x1)
#define DM9000_Tcos     (0x1)
#define DM9000_Tacc     (0x5)
#define DM9000_Tcoh     (0x1)
#define DM9000_Tah      (0xC)
#define DM9000_Tacp     (0x9)  
#define DM9000_PMC      (0x1)  
struct exynos_sromc {
       unsigned int bw;
       unsigned int bc[6];
};
* s5p_config_sromc() - select the proper SROMC Bank and configure the
* band width control and bank control registers
* srom_bank    - SROM
* srom_bw_conf  - SMC Band witdh reg configuration value
* srom_bc_conf  - SMC Bank Control reg configuration value

void exynos_config_sromc(u32 srom_bank, u32 srom_bw_conf, u32 srom_bc_conf)

       unsigned int tmp;
       struct exynos_sromc *srom = (struct exynos_sromc *)(EXYNOS4412_SROMC_BASE);
        Configure SMC_BW register to handle proper SROMC bank
       tmp = srom->bw;
       tmp &= ~(0xF << (srom_bank * 4));
       tmp |= srom_bw_conf;
       srom->bw = tmp;
        Configure SMC_BC register
       srom->bc[srom_bank] = srom_bc_conf;

static void dm9000aep_pre_init(void)

      unsigned int tmp;
      unsigned char smc_bank_num = 1;
      unsigned int     smc_bw_conf=0;
      unsigned int     smc_bc_conf=0;
     
       gpio configuration
      writel(0x00220020, 0x11000000 + 0x120);
      writel(0x00002222, 0x11000000 + 0x140);
       16 Bit bus width
      writel(0x22222222, 0x11000000 + 0x180);
      writel(0x0000FFFF, 0x11000000 + 0x188);
      writel(0x22222222, 0x11000000 + 0x1C0);
      writel(0x0000FFFF, 0x11000000 + 0x1C8);
      writel(0x22222222, 0x11000000 + 0x1E0);
      writel(0x0000FFFF, 0x11000000 + 0x1E8);              
      smc_bw_conf &= ~(0xf<<4);
      smc_bw_conf |= (1<<7) | (1<<6) | (1<<5) | (1<<4);
      smc_bc_conf = ((DM9000_Tacs << 28)
                   | (DM9000_Tcos << 24)
                   | (DM9000_Tacc << 16)
                   | (DM9000_Tcoh << 12)
                   | (DM9000_Tah << 8)
                   | (DM9000_Tacp << 4)
                    | (DM9000_PMC));
      exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf);

#endif

gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);

后添加

#ifdef CONFIG_DRIVER_DM9000
dm9000aep_pre_init();
#endif

在文件末尾添加

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)                                                  
{      
      int rc = 0;
#ifdef CONFIG_DRIVER_DM9000
      rc = dm9000_initialize(bis);                                            
#endif                                                                        
      return rc;                                                              
}  
#endif

2、 修改配置文件添加网络相关配置$ vim   include/configs/origen.h修改

85 #undef CONFIG_CMD_PING

#define  CONFIG_CMD_PING

修改

90 #undef CONFIG_CMD_NET

#define  CONFIG_CMD_NET

在文件末尾

#endif  __CONFIG_H    

前面添加

#ifdef CONFIG_CMD_NET
#define CONFIG_NET_MULTI
#define CONFIG_DRIVER_DM9000  1
#define CONFIG_DM9000_BASE    0x05000000 //内存基地址
#define DM9000_IO         CONFIG_DM9000_BASE
#define DM9000_DATA       (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT
#define CONFIG_DM9000_NO_SROM  1
#define CONFIG_ETHADDR   11:22:33:44:55:66
#define CONFIG_IPADDR     192.168.6.187
#define CONFIG_SERVERIP         192.168.6.186
#define CONFIG_GATEWAYIP       192.168.1.1
#define CONFIG_NETMASK   255.255.255.0
#endif

其中CONFIG_DM9000_BASE 地址为何是0x05000000,后续章节会详细分析。

6. FLASH移植 (EMMC)移植EMMC需要添加一些源文件:cmd_mmc.c
cmd_mmc_fdisk.c
cmd_movi.c
mmc.c
mmc.h
movi.c
movi.h
s5p_mshc.c
s5p_mshc.h

这些文件,由三星提供。

添加相关驱动
cp  movi.c  arch/arm/cpu/armv7/exynos/

修改文件arch/arm/cpu/armv7/exynos/Makefile在pinmux.o 后添加movi.o

修改板级文件 board/samsung/origen/origen.c,在

#include <asm/arch/mmc.h>

后面添加

#include <asm/arch/clk.h>
#include "origen_setup.h"

#ifdef CONFIG_GENERIC_MMC

后面添加

u32 sclk_mmc4;  clock source for emmc controller
#define __REGMY(x) (*((volatile u32 *)(x)))
#define CLK_SRC_FSYS  __REGMY(EXYNOS4_CLOCK_BASE + CLK_SRC_FSYS_OFFSET)
#define CLK_DIV_FSYS3 __REGMY(EXYNOS4_CLOCK_BASE + CLK_DIV_FSYS3_OFFSET)
int emmc_init()

u32 tmp;
u32 clock;
u32 i;
 setup_hsmmc_clock
 MMC4 clock src = SCLKMPLL
tmp = CLK_SRC_FSYS & ~(0x000f0000);
CLK_SRC_FSYS = tmp | 0x00060000;
 MMC4 clock div
tmp = CLK_DIV_FSYS3 & ~(0x0000ff0f);
clock = get_pll_clk(MPLL)/1000000;
  for(i=0 ; i<=0xf; i++)  {
     sclk_mmc4=(clock/(i+1));
 if(sclk_mmc4 <= 160) //200
        {
  CLK_DIV_FSYS3 = tmp | (i<<0);
  break;
 }

  emmcdbg("[mjdbg] sclk_mmc4:%d MHZ; mmc_ratio: %d",sclk_mmc4,i);
  sclk_mmc4 *= 1000000;
 
   * MMC4 EMMC GPIO CONFIG
   *
   * GPK0[0] SD_4_CLK
   * GPK0[1] SD_4_CMD
   * GPK0[2] SD_4_CDn
   * GPK0[3:6] SD_4_DATA[0:3]
   
   writel(readl(0x11000048)&~(0xf),0x11000048); //SD_4_CLK/SD_4_CMD pull-down enable
   writel(readl(0x11000040)&~(0xff),0x11000040);//cdn set to be output
   writel(readl(0x11000048)&~(3<<4),0x11000048); //cdn pull-down disable
   writel(readl(0x11000044)&~(1<<2),0x11000044); //cdn output 0 to shutdown the emmc power
   writel(readl(0x11000040)&~(0xf<<8)|(1<<8),0x11000040);//cdn set to be output
   udelay(100*1000);
   writel(readl(0x11000044)|(1<<2),0x11000044); //cdn output 1
   writel(0x03333133, 0x11000040);
   writel(0x00003FF0, 0x11000048);
   writel(0x00002AAA, 0x1100004C);
#ifdef CONFIG_EMMC_8Bit
   writel(0x04444000, 0x11000060);
   writel(0x00003FC0, 0x11000068);
   writel(0x00002AAA, 0x1100006C);
#endif
#ifdef USE_MMC4
   smdk_s5p_mshc_init();
#endif

将 int board_mmc_init(bd_t *bis)函数内容改写为

int board_mmc_init(bd_t *bis)

 int i, err;
#ifdef CONFIG_EMMC
 err = emmc_init();
#endif
 return err;

在末尾添加

#ifdef CONFIG_BOARD_LATE_INIT
#include <movi.h>
int  chk_bootdev(void)//mj for boot device check

 char run_cmd[100];
 struct mmc *mmc;
 int boot_dev = 0;
 int cmp_off = 0x10;
 ulong  start_blk, blkcnt;
 mmc = find_mmc_device(0);
 if (mmc == NULL)
 {
  printf("There is no eMMC card, Booting device is SD card");
  boot_dev = 1;
  return boot_dev;
 }
 start_blk = (24*1024/MOVI_BLKSIZE);
 blkcnt = 0x10;
 sprintf(run_cmd,"emmc open 0");
 run_command(run_cmd, 0);
 sprintf(run_cmd,"mmc read 0 %lx %lx %lx",CFG_PHY_KERNEL_BASE,start_blk,blkcnt);
 run_command(run_cmd, 0);
  switch mmc to normal paritition
 sprintf(run_cmd,"emmc close 0");
 run_command(run_cmd, 0);
 return 0;

int board_late_init (void)

    int boot_dev =0 ;
    char boot_cmd[100];
    boot_dev = chk_bootdev();
    if(!boot_dev)
    {
          printf("Checking Boot Mode ... EMMC4.41");
    }
    return 0;

#endif
添加相关命令
$ cp    cmd_movi.c  common/
$ cp    cmd_mmc.c  common/
$ cp cmd_mmc_fdisk.c  common/

修改common/Makefile在

COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o

后添加

COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.o
COBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o

添加驱动

$ cp   mmc.c  drivers/mmc/
$ cp   s5p_mshc.c  drivers/mmc/
$ cp   mmc.h  include/
$ cp   movi.h  include/
$ cp   s5p_mshc.h  include/

修改Makefile

$vim  drivers/mmc/Makefile

<上一页  1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    人工智能 猎头职位 更多
    扫码关注公众号
    OFweek人工智能网
    获取更多精彩内容
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号