1.     TI AM335x  内核源码分析

1.1 Board-am335xevm.c

Board-am335xevm.c(./arch/arm/mach-omap2)中开始执行入口:

MACHINE_START(AM335XEVM,"am335xevm")

/* Maintainer: Texas Instruments */

.atag_offset     = 0x100,

.map_io             =am335x_evm_map_io,

.init_early         = am33xx_init_early,

.init_irq    = ti81xx_init_irq,

.handle_irq     = omap3_intc_handle_irq,

.timer                =&omap3_am33xx_timer,

.init_machine  = am335x_evm_init,

MACHINE_END

MACHINE_START(AM335XIAEVM,"am335xiaevm")

/* Maintainer: Texas Instruments */

.atag_offset     = 0x100,

.map_io             =am335x_evm_map_io,

.init_irq    = ti81xx_init_irq,

.init_early         = am33xx_init_early,

.timer                =&omap3_am33xx_timer,

.init_machine  = am335x_evm_init,

MACHINE_END

1.2 am335x_evm_init

static void__init am335x_evm_init(void)

{

am33xx_cpuidle_init();

am33xx_mux_init(board_mux);

omap_serial_init();

am335x_evm_i2c_init();

//daughter_brd_detected = false;

am335x_evm_setup(NULL,NULL);                              //Tbao--------

omap_sdrc_init(NULL, NULL);

usb_musb_init(&musb_board_data);

omap_board_config = am335x_evm_config;

omap_board_config_size =ARRAY_SIZE(am335x_evm_config);

//setup_general_purpose_evm();

/* Create an alias for icss clock */

if (clk_add_alias("pruss",NULL, "pruss_uart_gclk", NULL))

pr_warn("failed tocreate an alias: icss_uart_gclk --> pruss\n");

/* Create an alias for gfx/sgx clock */

if (clk_add_alias("sgx_ck",NULL, "gfx_fclk", NULL))

pr_warn("failed tocreate an alias: gfx_fclk --> sgx_ck\n");

}

1.3 am335x_evm_setup

static voidam335x_evm_setup(struct memory_accessor *mem_acc, void *context)

{

setup_general_purpose_evm();

return;

#if 0

/* 1st get the MAC address from EEPROM*/

ret = mem_acc->read(mem_acc, (char*)&am335x_mac_addr,

EEPROM_MAC_ADDRESS_OFFSET,sizeof(am335x_mac_addr));

if (ret != sizeof(am335x_mac_addr)) {

pr_warning("AM335X: EVMConfig read fail: %d\n", ret);

return;

}

#endif

/* Fillup global mac id */

//am33xx_cpsw_macidfillup(&am335x_mac_addr[0][0],

//                         &am335x_mac_addr[1][0]);

#if 0

/* get board specific data */

ret = mem_acc->read(mem_acc, (char*)&config, 0, sizeof(config));

if (ret != sizeof(config)) {

pr_err("AM335X EVMconfig read fail, read %d bytes\n", ret);

pr_err("This likelymeans that there either is no/or a failed EEPROM\n");

goto out;

}

if (config.header !=AM335X_EEPROM_HEADER) {

pr_err("AM335X: wrongheader 0x%x, expected 0x%x\n",

config.header,AM335X_EEPROM_HEADER);

goto out;

}

if (strncmp("A335",config.name, 4)) {

pr_err("Board%s\ndoesn't look like an AM335x board\n",

config.name);

goto out;

}

snprintf(tmp, sizeof(config.name) + 1,"%s", config.name);

pr_info("Board name: %s\n",tmp);

snprintf(tmp, sizeof(config.version) +1, "%s", config.version);

pr_info("Board version:%s\n", tmp);

if (!strncmp("A335BONE",config.name, 8)) {

daughter_brd_detected =false;

if(!strncmp("00A1",config.version, 4) ||

!strncmp("00A2", config.version,4))

setup_beaglebone_old();

else

setup_beaglebone();

} else if (!strncmp("A335BNLT",config.name, 8)) {

setup_beagleboneblack();

} else if(!strncmp("A335X_SK", config.name, 8)) {

daughter_brd_detected =false;

#endif

//setup_starterkit();

#if 0

} else {

/* only 6 characters ofoptions string used for now */

snprintf(tmp, 7,"%s", config.opt);

pr_info("SKU:%s\n", tmp);

if(!strncmp("SKU#01", config.opt, 6))

setup_general_purpose_evm();

else if(!strncmp("SKU#02", config.opt, 6))

setup_ind_auto_motor_ctrl_evm();

else

goto out;

}

am335x_opp_update();

/*

* For now, Beaglebone Black uses PG 2.0 thatare speed binned and operate

* up to 1GHz. So re-enable Turbo and Nitromodes,

*/

if (!strncmp("A335BNLT",config.name, 8)) {

struct device *mpu_dev;

mpu_dev = omap_device_get_by_hwmod_name("mpu");

opp_enable(mpu_dev,

AM33XX_ES2_0_OPPTURBO_FREQ);

opp_enable(mpu_dev,

AM33XX_ES2_0_OPPNITRO_FREQ);

}

#endif

1.4 setup_general_purpose_evm

static voidsetup_general_purpose_evm(void)

{

u32prof_sel = am335x_get_profile_selection();

u32boardid = GEN_PURP_EVM;

if(!strncmp("1.5A", config.version, 4))

boardid= GEN_PURP_DDR3_EVM;

pr_info("Theboard is general purpose EVM %sin profile %d\n",

((boardid== GEN_PURP_DDR3_EVM) ? "with DDR3 " : ""),

prof_sel);

_configure_device(boardid,invt_evm_dev_cfg, -1);   //*****Tbao*****

am33xx_cpsw_init(AM33XX_CPSW_MODE_RMII,NULL, NULL);

/*Atheros Tx Clk delay Phy fixup */

phy_register_fixup_for_uid(AM335X_EVM_PHY_ID,AM335X_EVM_PHY_MASK,

beaglebone_phy_fixup);

}

_configure_device初始化:结构体很重要,初始化就是初始化这些函数指针结构体

static struct evm_dev_cfginvt_evm_dev_cfg[] = {

{enable_ecap0,        DEV_ON_BASEBOARD, PROFILE_NONE},

{lcdc_init,          DEV_ON_BASEBOARD, PROFILE_NONE},

{mfd_tscadc_init,    DEV_ON_BASEBOARD, PROFILE_NONE},

{rmii1_init,       DEV_ON_BASEBOARD, PROFILE_NONE},

{rmii2_init,       DEV_ON_BASEBOARD, PROFILE_NONE},

{usb0_init,        DEV_ON_BASEBOARD, PROFILE_NONE},

{usb1_init,        DEV_ON_BASEBOARD, PROFILE_NONE},

{evm_nand_init,DEV_ON_BASEBOARD,PROFILE_NONE},

{mmc0_init,     DEV_ON_BASEBOARD, PROFILE_NONE},

{spi0_init,         DEV_ON_BASEBOARD, PROFILE_NONE},

//{uart1_init,   DEV_ON_DGHTR_BRD, PROFILE_NONE},

//{switch1_init,        DEV_ON_DGHTR_BRD, PROFILE_NONE},

//{poweroff_init,      DEV_ON_DGHTR_BRD, PROFILE_NONE},

{NULL,0,0},

};

1.5 _configure_device

static void _configure_device(intevm_id, struct evm_dev_cfg *dev_cfg,

intprofile)

{

inti;

am335x_evm_set_id(evm_id);

if(profile == PROFILE_NONE) {

for(i = 0; dev_cfg->device_init != NULL; dev_cfg++) {

if(dev_cfg->device_on == DEV_ON_BASEBOARD)

dev_cfg->device_init(evm_id,profile);

elseif (daughter_brd_detected == true)

dev_cfg->device_init(evm_id,profile);

}

}else {

for(i = 0; dev_cfg->device_init != NULL; dev_cfg++) {

if(dev_cfg->profile & profile) {

if(dev_cfg->device_on == DEV_ON_BASEBOARD)

dev_cfg->device_init(evm_id,profile);

elseif (daughter_brd_detected == true)

dev_cfg->device_init(evm_id,profile);

}

}

}

}

1.6 nand_base.c (drivers/mtd/nand)

在nand_base.c(drivers/mtd/nand) 中nand_scan_tail函数中加红色部分,加载文件系统:

/* Allow subpagewrites up to ecc.steps. Not possible for MLC flash */

if (!(chip->options &NAND_NO_SUBPAGE_WRITE) &&

!(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {

switch (chip->ecc.steps) {

case 2:

mtd->subpage_sft= 1;

break;

case 4:

case 8:

case 16:

mtd->subpage_sft= 2;

break;

}

mtd->subpage_sft= 0; //Tbao****************

}

chip->subpagesize =mtd->writesize >> mtd->subpage_sft;

linux 内核代码分析1 TI am335x相关推荐

  1. a335x换linux内核,linux 内核代码分析1 TI am335x

    1.     TI AM335x  内核源码分析 1.1 Board-am335xevm.c Board-am335xevm.c(./arch/arm/mach-omap2)中开始执行入口: MACH ...

  2. Linux内核代码 分析大纲思维导图

  3. Linux内核分析2:一个简单的时间片轮转多道程序内核代码分析

    Lab2:一个简单的时间片轮转多道程序内核代码 席金玉   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  4. Linux内核源代码分析-第三章 内核体系结构概述-1

    第3章 内核体系结构概述 本章从较高层次上对内核进行说明.从顺序上来说,本章首先介绍内核设计目标,接下来 介绍内核体系结构,最后介绍内核源程序目录结构. 3.1 内核设计目标 Linux 的内核展现出 ...

  5. Linux内核源代码分析——fork()原理多进程网络模型

    今晚和一位500强的leader喝喝小酒吃吃烤鱼,生活乐无边.这位兄弟伙才毕业2年,已经做到管理层了,机遇和能力不可谓不好.喝酒之余,聊到Linux内核的两个问题--fork().exec()的原理. ...

  6. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  7. Linux内核源代码分析-目录

    第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...

  8. Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...

    在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...

  9. Linux内核部件分析 设备驱动模型之driver ---mark 详细

    Linux内核部件分析 设备驱动模型之driver 转载:https://www.linuxidc.com/Linux/2011-10/44627p7.htm 上节我们分析设备驱动模型中的device ...

最新文章

  1. kali扫描内网ip_来,我们聊聊内网渗透!
  2. 深入理解 x86/x64 的中断体系--IVT VS IDT
  3. 程序员的自我修养之马桶修理工:compose方法的妙用!
  4. maven WEB项目启动没问题访问页面就报错:org.apache.jasper.JasperException: Unable to compile class for JSP
  5. 一些关于bootstrap,bagging,Adaboost,random forest, gradient boost的基本理解
  6. SpringBoot_日志-日志框架分类和选择
  7. 腾讯开源再获OSCAR 5项大奖,全国首家可信开源治理认证自发开源企业
  8. HDFS、MR、Kafka、Storm、Spark、Hbase、Redis原理图
  9. 2021瑞安高考成绩查询,温州教育网官网登录入口2021瑞安中考成绩查询中招查分系统...
  10. ES9新特性_ES9正则扩展-命名捕获分组---JavaScript_ECMAScript_ES6-ES11新特性工作笔记054
  11. linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...
  12. wine QQ安装笔记
  13. 计算机主机有自带的声音吗,台式电脑主机前面的插孔没声音怎么回事?如何解决?...
  14. 为知笔记保存为html,为知笔记怎么保存网页 为知笔记保存网页教程
  15. angluarjs+springmvc实现excel上传并解析,对个别字段进行非空校验,txt生成,txt生成的条件为某列必须为某值且只提供固定的几列发送到ftp...
  16. linux 深度定制,基于ubuntu发行版的安装界面的深度定制过程
  17. 如何在Windows 7中将管理工具添加到开始菜单
  18. oracle ebs form查询,Oracle EBS FORM 更改记录状态
  19. 零基础而且英语不好可以学java吗
  20. 学了代码之后,对于程序员黑客的区别,我的认识是......

热门文章

  1. element-plus Text文本标签无法使用,报错:Failed to resolve component: el-text
  2. DirectX版本说明
  3. c语言大地坐标转换空间坐标,大地坐标与空间直角坐标转换_C程序
  4. 华容道06--屏幕点击事件和角色间的碰撞
  5. Linux中查看系统进程的相关命令
  6. 全球唯一禁欲的地方:男人从没见过女人
  7. LabVIEW循环结构之移位寄存器
  8. 【高级开发进阶】Redis五大数据结构应用场景落地
  9. 自监督模型---MoCoV3
  10. source insight 4.0微软黑色主题 visual studio 2013深色风格