这个函数的实现为:
/* helper function */
static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
{
     if (cplb_data[i].psize) {
         fill_cplbtab(t,
                   cplb_data[i].start,
                   cplb_data[i].end,
                   cplb_data[i].psize,
                   cplb_data[i].i_conf);
     #if defined(CONFIG_BFIN_ICACHE)
         if (ANOMALY_05000263 && i == SDRAM_KERN) {
              fill_cplbtab(t,
                       cplb_data[i].start,
                       cplb_data[i].end,
                       SIZE_4M,
                       cplb_data[i].i_conf);
         } else
#endif
} else {
              fill_cplbtab(t,
                       cplb_data[i].start,
                       a_start,
                       SIZE_1M,
                       cplb_data[i].i_conf);
              fill_cplbtab(t,
                       a_start,
                       a_end,
                       SIZE_4M,
                       cplb_data[i].i_conf);
              fill_cplbtab(t, a_end,
                       cplb_data[i].end,
                       SIZE_1M,
                       cplb_data[i].i_conf);
         }
}
static unsigned short __init
fill_cplbtab(struct cplb_tab *table,
          unsigned long start, unsigned long end,
          unsigned long block_size, unsigned long cplb_data)
{
     int i;
     switch (block_size) {
     case SIZE_4M:
         i = 3;
         break;
     case SIZE_1M:
         i = 2;
         break;
     case SIZE_4K:
         i = 1;
         break;
     case SIZE_1K:
     default:
         i = 0;
         break;
     }
     cplb_data = (cplb_data & ~(3 << 16)) | (i << 16);
     while ((start < end) && (table->pos < table->size)) {
         table->tab[table->pos++] = start;
         if (lock_kernel_check(start, start + block_size) == IN_KERNEL)
              table->tab[table->pos++] =
                  cplb_data | CPLB_LOCK | CPLB_DIRTY;
         else
              table->tab[table->pos++] = cplb_data;
         start += block_size;
     }
     return 0;
}
1             L1 I-Memory
     {
         .start = L1_CODE_START,
         .end = L1_CODE_START + L1_CODE_LENGTH,
         .psize = SIZE_4M,
         .attr = INITIAL_T | SWITCH_T | I_CPLB,
         .i_conf = L1_IMEMORY,
         .d_conf = 0,
         .valid = 1,
         .name = "L1 I-Memory",
     },
这个块传递进来时,它将直接调用
         fill_cplbtab(t,
                   cplb_data[i].start,
                   cplb_data[i].end,
                   cplb_data[i].psize,
                   cplb_data[i].i_conf);
从fill_cplbtab这个函数可以看出此时ICPLB_ADDR的值将为L1_CODE_START,也就是0xffa0 0000,而ICPLB_DATA的值将为0x0003 0007,这个值的意义是:
16位和17位的值为11,即页面大小为4M。
第0位,也即CPLB_VALID,为1,表示Valid CPLB Entry。
第1位,也即CPLB_LOCK,为1,表示CPLB Entry Should not be replaced。
第2位,也即CPLB_USER_RD,为1,表示User mode read access permitted。
2             Kernel Memory
     {
         .start = 0,
         .end = 0, /* dynamic */
         .psize = 0,
         .attr = INITIAL_T | SWITCH_T | I_CPLB | D_CPLB,
         .i_conf = SDRAM_IGENERIC,
         .d_conf = SDRAM_DGENERIC,
         .valid = 1,
         .name = "Kernel Memory",
     },
这个块传进来的时候,它将调用
              fill_cplbtab(t,
                       cplb_data[i].start,
                       cplb_data[i].end,
                       SIZE_4M,
                       cplb_data[i].i_conf);
此时将生成15个SDRAM的块,每个都是4M,且从0开始递增。此时它们的CPLB_DATA值将为0x0003 1205,这个值的意义是:
16位和17位的值为11,即页面大小为4M。
第0位,也即CPLB_VALID,为1,表示Valid CPLB Entry。
第1位,也即CPLB_LOCK,为0,表示CPLB Entry can be replaced。
第2位,也即CPLB_USER_RD,为1,表示User mode read access permitted。
第9位,也即CPLB_MEM_LEV,为1,表示Determins Line Buffer, Low Priority。
第12位,也即CPLB_L1_CHBL,为1,表示Cacherable in l1。

uclinux-2008r1(bf561)内核的icache支持(3):__fill_code_cplbtab相关推荐

  1. 再读内核存储管理(7):icache支持

    快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com 本文适用于 ADI bf561 DSP uclinux-2008r1-rc8 (移植到vds ...

  2. RTL9300 修改内核和busybox支持 vlan if接口注册到内核

    //修改内核+busybox,支持vlan if虚接口//Note:开启8021q-vlan功能.|| make menuconfig赞未支持8021q kconfig也未配置其依赖.0.make 9 ...

  3. 分离内核和虚拟机支持安全的关键任务边缘计算

    分离内核和虚拟机支持安全的关键任务边缘计算 Separation kernels and VMs enable secure mission critical edge computing Lynx软 ...

  4. harmonyos资料整理:HarmonyOS采用多内核设计,支持针对不同资源受限设备选用适合的OS内核(linux是一个内核,不是一个完整的操作系统,例如ubuntu 是操作系统,内核是Linux)

    文章目录 前言 技术特性 硬件互助,资源共享 一次开发,多端部署 统一OS,弹性部署 技术架构 系统安全 see also 前言 HarmonyOS是一款"面向未来".面向全场景( ...

  5. X5浏览器支持HTML5吗,腾讯X5 Blink内核 加强H5支持和渲染性能支撑

    原标题:腾讯X5 Blink内核 加强H5支持和渲染性能支撑 腾讯浏览服务TBS2.0即日全量发布,X5内核升级到Blink版本,H5能力和渲染性能全面提升.随着TBS2.0的发布,使用TBS浏览服务 ...

  6. linux内核4.0,新闻|Linux内核4.0功能:实时内核补丁,支持PS3

    Linux Torvalds 在Linux内核邮件列表里发布了Linux内核新的稳定版. Linux 4.0,代号为'Hurr durr I'm a sheep',带来了一小系列新硬件支持,驱动改进, ...

  7. linux内核5.3支持cpu,Linux 5.3版内核重磅发布:支持中国兆芯x86 CPU

    经过两个月的开发和八个RC候选版本之后,Linus Torvalds今天终于正式发布了Linux Kernel 5.3版内核.虽然因为旅游耽误了一个星期,但是这个版本带来了诸多重磅更新,值得等待和升级 ...

  8. 第二部分 s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持

    三.内核的移植 说明:针对的是百问网的jz2440 gcc:4.9.1 1.移植内核 首先,下载源码包:https://www.kernel.org/ 现在时间为2014年12月20日其主界面截图为: ...

  9. 定制 kali nethunter内核 (官方不支持的手机)

    Kali Linux NetHunter内核编译指南 发表于 2021-09-12   更新于 2022-10-08   分类于 kali   阅读次数:   阅读次数: 1890   Valine: ...

最新文章

  1. Nature回应南大花120万发特刊!被骂上热搜,南大到底委不委屈?
  2. excel单元格调用mysql数据_Excel 使用单元格的值 查询MySQL数据库并返回数据给相应的单元格...
  3. 区域赛铜牌专题(一)
  4. Mysql数据库——数据类型和约束
  5. escape character.
  6. 电子地图“顽疾”难治,会“传染”自动驾驶专用高精地图吗?
  7. Filco圣手二代双模蓝牙机械键盘|科大讯飞鼠标连接Mac方法
  8. 最新麦子学院嵌入式开发系列培训教程
  9. linux戒游戏下载,苍月之戒手游下载-苍月之戒公测版v1.0-Linux公社
  10. 抢红包算法 c++_“抠抠族”的出行利器,斤斤计较的几何C为了节能果然够拼
  11. 数据加密-国密SM2对数据进行加解密
  12. headfirst 笔记 第七章
  13. 【中国数据创新琅琊榜】数联易康医疗大数据平台,创新健康医疗产业变革的推动者和见证者!
  14. chmod 权限777 -rwxrwxrwx是什么意思
  15. ManualResetEvent用法详解
  16. 如何进行第一次单片机烧录
  17. 技术员 Ghost Win10 x64 装机版/纯净版 201710
  18. 解决触摸板synatipics与键盘驱动相冲突问题——win8.1
  19. Lucene 搜索词分词
  20. A tutorial on Principal Components Analysis | 主成分分析(PCA)教程

热门文章

  1. 思科华为设备端口聚合配置命令对比
  2. 搭建Joomla基础管理平台
  3. Windows结束任务管理器进程后,桌面消失如何解决?
  4. 谷歌中国全球首发Google音乐
  5. ubuntu桌面图标管理(以pycharm图标为例)
  6. vue+element-UI实现右键菜单
  7. 2021-05-25
  8. ZYNQ7020-linux下使用pl端扩展串口,内核无法启动,串口无反应解决方案-2-问题探究
  9. 如何用一条命令将网页转成电脑 App
  10. html5页面转appstore,跳转App Store那些事儿