a335x换linux内核,linux 内核代码分析1 TI am335x
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.6nand_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;
a335x换linux内核,linux 内核代码分析1 TI am335x相关推荐
- a335x换linux内核,linux 內核代碼分析1 TI am335x
1. TI AM335x 內核源碼分析 1.1 Board-am335xevm.c Board-am335xevm.c(./arch/arm/mach-omap2)中開始執行入口: MACH ...
- linux 内核代码分析1 TI am335x
1. TI AM335x 内核源码分析 1.1 Board-am335xevm.c Board-am335xevm.c(./arch/arm/mach-omap2)中开始执行入口: MACH ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- linux内核中链表代码分析---list.h头文件分析(一)
linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17:13:14 在学习数据结构时,有一个重要的知识点就是链表.对于链表的一些基本操作,它的最好学习资料就是内核中的li ...
- Linux SCSI设备容量打印代码分析
探寻SCSI设备容量如何获取代码. 分析 8G USB转SD卡启动打印信息: sd 3:0:0:0: [sdb] 15523840 512-byte logical blocks: (7.94 GB/ ...
- 嵌入式Linux内核移植相关代码分析(转)
本文通过整理之前研发的一个项目(ARM7TDMI +uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考.整理过程中也同时参考了众多网友的帖子,在此谢过.由于整理过程匆忙,难免 错误 ...
- 慢慢欣赏linux之串口驱动代码分析 - 基于powerpc 2.6.x版本
串口驱动分两阶段初始化 第一阶段 串口驱动没有初始化前的准备工作,包括设备树的解析,platform设备注册 asmlinkage void __init start_kernel(void) ...
- linux drm 架构及linux drm 架构 之代码分析
转自: http://manpages.ubuntu.com/manpages/utopic/man7/drm-kms.7.html 根据自己的理解来转述一下: 摘要: DRM 是linux 下的图形 ...
- linux ip rcv,Linux网络层 ip_rcv()函数代码分析(__pskb_pull_tail)
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) //几个结构sk_buff套接字缓存,n ...
最新文章
- thinkphp 整合 swiftmailer 实现邮件发送
- 作者:周大铭,管理科学与工程博士,工业和信息化部赛迪研究院软件所助理研究员。...
- pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
- [转帖] Windows 与linux的栈大小问题
- 女孩子偷偷学好软件测试,想要年薪30w也没有很难!
- mupdf嵌入 html页面,MuPDF Command Line Tools
- 云桌面服务器资源计算机,桌面云服务器资源计算机
- 【Rollo的Python之路】比较运算符
- 监控-Kafka Manager
- 黑马程序员 Python学习笔记之 程序执行原理(科普)
- css实现圆球旋像水波波动_66 个超有用的CSS 特效!
- CKS学习笔记-Sysdig
- 盘点MAC下用过的五笔输入法
- Oracle11g Dataguard配置
- c语言可以绘制中国地图源码,echarts画中国地图,省市区地图分享
- backdoor-factory工具使用
- Python在WRF模型自动化运行及前后处理中的应用
- 用matlab画树叶,matlab画漂亮的树叶
- php仿糗事百科,基于thinkphp框架开发仿糗事百科笑话系统
- 如何打开ESRI ArcGIS的LPK文件(layer package)
热门文章
- matlab 函数调试实验,C语言实验matlab中filter和filtfilt函数
- HTML5+CSS3的响应式网页设计:自动适应屏幕宽度 转自:欲思博客
- MFC Windows 程序设计[327]之树形表格控件例程(附源码)
- 如何查看每个城市的生意如何?
- Autodesk Inventor Pro 2023 三维机械设计软件安装说明
- 2013软创基地年度大会(深圳站 20131102)——敏捷落地!
- 【经验分享】在使用WPS打字时,后边跟着拼音
- 去甲肾上腺素是什么?
- gin proxy代理
- 2022-2028全球及中国自动车牌读取器行业研究及十四五规划分析报告