GD32450i-EVAL跑ucLinux配置笔记

配置u-boot

基于stm32f429-discovery开发板的u-boot进行修改
cp -r u-boot ./u-boot_gd32450i-eval
cd u-boot_gd32450i-eval
make
make成功后再进行修改。

1、配置时钟

HSE 25MHZ,SystemCoreClock 200MHZ, 在u-boot_gd32450i-eval/include/configs/stm32f429i-discory.h中配置锁相环参数: M = 25, N = 400, P = 2, Q = 9。

2、配置网络

  • 网络芯片使用LAN8720,时钟是由GD32F450 PA8脚提供的50MHZ。
    修改drivers/gpio/stm32f2_gpio.c中的stm32f2_gpio_config函数,和af_val数组,为PA8新增AF0,CLKOUT功能。
    修改include/asm-arm/arch/stm32f2_gpio.h新增CLKOUT的AF配置选项
    修改driver/net/stm32_eth.c新增PA8口的配置,在RCC_CFG0寄存器中使能CLKOUT0功能,配置为50MHZ。

  • linux系统下的管脚修改在linux/arch/arm/mach-stm32/iomux.c里的stm32_iomux_init(void)函数里。

#if defined(CONFIG_STM32_MAC)
		do {
			static struct stm32f2_gpio_dsc mii_gpio[] = {
				{0,  1}, {0,  2}, {0,  7},
				{1,  5}, {1,  8},
				{2,  1}, {2,  2}, {2,  3}, {2,  4}, {2,  5},
				{6, 11}, {6, 13}, {6, 14},
				{7,  2}, {7,  3}, {7,  6}, {7,  7},
				{8, 10}
			};
			static struct stm32f2_gpio_dsc rmii_gpio[] = {
				{0,  1}, {0,  2}, {0,  7},
				{2,  1}, {2,  4}, {2,  5},
				{1, 11}, {6, 13}, {6, 14},
			};
			int	i;

			if (platform == PLATFORM_STM32_STM_SOM ||
			    platform == PLATFORM_STM32_STM_DISCO ||
			    platform == PLATFORM_STM32_STM_STM32F439_SOM ||
			    platform == PLATFORM_STM32_STM_STM32F7_SOM ||
			    platform == PLATFORM_STM32_STM32F7_DISCO) {
				for (i = 0; i < ARRAY_SIZE(rmii_gpio); i++) {
					stm32f2_gpio_config(&rmii_gpio[i],
						STM32F2_GPIO_ROLE_ETHERNET);
				}
			} else {
				for (i = 0; i < ARRAY_SIZE(mii_gpio); i++) {
					stm32f2_gpio_config(&mii_gpio[i],
						STM32F2_GPIO_ROLE_ETHERNET);
				}
			}
		} while (0);
#endif
  • 这样配置完之后,uboot下网络是通了,可是Linux下死活不通,让我好一番郁闷。经过一个星期的不断挠头,终于发现问题所在,在linux下初始mac时要先软复位一下。但是stm32f429芯片就不需要软复位。
    修改linux/drivers/net/arm/stm32_eth.c中的stm32_eth_hw_start函数,新增MAC软复位的代码,第8行至第25行为新增代码。
/*
 * Hw initialization
 */
static int stm32_eth_hw_start(struct net_device *dev)
{
	struct stm32_eth_priv	*stm = netdev_priv(dev);
	int			i, rv;
	int timeout = 2000;	//2s

	stm->regs->dmabmr |= STM32_MAC_DMABMR_SR;
	rv = -1;
	while(timeout-->0){
		if(stm->regs->dmabmr & STM32_MAC_DMABMR_SR){
			msleep(1);
		} else {
			timeout = 0;
			rv = 0;
		}
	}

	if(rv != 0)
	{
		printk("Software reset MAC timeout!\n");
		goto out;
	}
	/*
	 * Reset and configure
	 */
	stm32_eth_hw_stop(dev);

3、新建工程

在参考工程根目录下执行make clone new=new_project_name来创建一个新工程。
在这里插入图片描述

4、修改kernel在内存中的加载地址

修改project/gd32450i-eval/gd32450i-eval.kernel.STMDISO文件,将0xD0000000改为0xC0000000。
这个文件里的参数应该和u-boot的配置匹配。
在这里插入图片描述

备注:

  • u-boot的启动在lib_arm/board.c中的start_armboot

  • 内存报错
    在这里插入图片描述
    上面的错误是SDRAM没配置好引起的,将内存参数改成下面的就好了。注意配置的是SDRAM控制器0,而不是原来的SDRAM控制器1.
    在这里插入图片描述
    在这里插入图片描述

  • 启动内核报错
    在这里插入图片描述
    怎么解的来着,忘了。

  • 内存报错,GD32F450比STM32F429多了一个SDRAM的读采样控制寄存器,寄存器地址为0XA0000180.只需将0x11写入即可。让读延时一个时钟周期。
    在这里插入图片描述
    在这里插入图片描述

  • ucLinux的自启动脚本是project/gd32450i-eval/local/rc

  • linux/arch/arm/mach-stm32/iomux.c中修改外设使用的管脚。
    在这里插入图片描述
    在这里插入图片描述

  • 网络ping大包丢包 ping 192.168.0.1 -s 350,当单包数据超过350字节时丢包率超过90%
    在GD32的网卡配置里使能存储转发功能就可以了。

/*
* DMAOMR reg fields
*/
#define STM32_MAC_DMAOMR_SR             (1 << 1)        /* Start/stop rx      */
#define STM32_MAC_DMAOMR_ST             (1 << 13)       /* Start/stop tx      */
#define STM32_MAC_DMAOMR_FTF            (1 << 20)       /* Flush tx FIFO      */
#define STM32_MAC_DMAOMR_TSF            (1 << 21)       /* Start/stop rx      */	新增
#define STM32_MAC_DMAOMR_RSF            (1 << 25)       /* Start/stop tx      */ 新增

static int stm32_eth_hw_start(struct net_device *dev)里新增一句

stm->regs->dmabmr = (32 << STM32_MAC_DMABMR_PBL_BIT) |
                            (32 << STM32_MAC_DMABMR_RDP_BIT) |
                            (STM32_MAC_DMABMR_RTPR_2_1 <<
                             STM32_MAC_DMABMR_RTPR_BIT) |
                            STM32_MAC_DMABMR_FB | STM32_MAC_DMABMR_USP |
                            STM32_MAC_DMABMR_AAB;

    stm->regs->dmaomr |= (STM32_MAC_DMAOMR_TSF | STM32_MAC_DMAOMR_RSF);  新增
        /*
         * Set MAC
         */
        stm->regs->maca0hr = (dev->dev_addr[5] <<  8) |
                             (dev->dev_addr[4] <<  0);
        stm->regs->maca0lr = (dev->dev_addr[3] << 24) |
                             (dev->dev_addr[2] << 16) |
                             (dev->dev_addr[1] <<  8) |
                             (dev->dev_addr[0] <<  0);

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jimbo_Zhang

有钱的捧个钱场

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

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

打赏作者

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

抵扣说明:

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

余额充值