在uclinux for bf561中使用B核(2): /dev/coreb提供的功能

原创 2007年09月29日 06:48:00
  
 由于uClinux只能在A核运行,因此它以驱动的形式提供了对B核的支持。默认配置下此支持是打开的,可以通过Kernel Settings -> Blackfin Processor Options -> BF561 Specific Configurations -> Core B support进行关闭。估计没人会做这种事吧?呵呵!。
以下的所有代码来自于:linux-2.6.x/arch/blackfin/mach-bf561/coreb.c,也就是/dev/coreb驱动的实现文件。
1、驱动状态查看
如果此驱动正确加载,在系统启动时有如下提示:
BF561 Core B driver v0.1 initialized.
通过以下命令可以看到此驱动的运行状态:
root:~> cat /sys/class/misc/coreb/coreb_status
Base Address:   0xff600000
Core B is stalled
SICA_SYSCR:     0022
SICB_SYSCR:     0020
 
IRQ Status:     Core A          Core B
ISR0:           00000000                00000000
ISR1:           00000000                00000000
IMASK0:         30000000                00000000
IMASK1:         008a8000                00000000
2、驱动实现的功能
下面看看这个驱动实现的功能。
static struct file_operations coreb_fops = {
       .owner = THIS_MODULE,
       .llseek = coreb_lseek,
       .read = coreb_read,
       .write = coreb_write,
       .ioctl = coreb_ioctl,
       .open = coreb_open,
       .release = coreb_release
};
 
static struct miscdevice coreb_dev = {
       COREB_MINOR,
       "coreb",
       &coreb_fops
};
在此模块加载时执行bf561_coreb_init函数,此函数中有一段代码:
       misc_register(&coreb_dev);
       if (class_device_create_file(coreb_dev.class, &class_device_attr_coreb_status))
              goto release_dma_src;
这两行代码向kernel注册了这个驱动的信息,从这个信息可以看出我们将可以对此设备进行打开和关闭。可以使用fread和fwrite进行数据读写,可用fseek进行指针的定位,还可用ioctl进行输入输出的控制。
从上面可知对ioctl调用的处理是由coreb_ioctl函数完成的,如下所示:
// 定义ioctl调用中可用的命令
#define CMD_COREB_INDEX            1
#define CMD_COREB_START            2
#define CMD_COREB_STOP              3
#define CMD_COREB_RESET            4
static int coreb_ioctl(struct inode *inode, struct file *file,
                     unsigned int cmd, unsigned long arg)
{
       int retval = 0;
       int coreb_index = 0;
 
       switch (cmd) {
    // 设置基址指针和可操作的空间大小,后面打开文件进行读写时将以此为基址。
       case CMD_COREB_INDEX:
              if (copy_from_user(&coreb_index, (int *)arg, sizeof(int))) {
                     retval = -EFAULT;
                     break;
              }
 
              spin_lock_irq(&coreb_lock);
              switch (coreb_index) {
              // 表示要对0xff60 0000 ~ 0xff60 4000这段16K的空间进行读写,也就是Core B中的L1指令缓存。当CoreB开始允许执行时,第一条指令也是从0xFF60 0000开始执行的。因此在允许B核运行之前,应当将可执行的代码写入到这里。
              case 0:
                     coreb_base = 0xff600000;
                     coreb_size = 0x4000;
                     break;
        // 表示要对0xff61 0000 ~ 0xff61 4000这段16K的地址空间进行操作,即B核中的L1指令缓存。
              case 1:
                     coreb_base = 0xff610000;
                     coreb_size = 0x4000;
                     break;
        // 表示要对0xff50 0000 ~ 0xff50 8000这段32K地址空间进行操作,这是B核中的数据缓存。
              case 2:
                     coreb_base = 0xff500000;
                     coreb_size = 0x8000;
                     break;
        // 表示要对0xff40 0000 ~ 0xff40 8000这段32K地址空间进行操作,这是B核中的另一段数据缓存。
              case 3:
                     coreb_base = 0xff400000;
                     coreb_size = 0x8000;
                     break;
              default:
                     retval = -EINVAL;
                     break;
              }
              spin_unlock_irq(&coreb_lock);
 
              mutex_lock(&file->f_dentry->d_inode->i_mutex);
              file->f_pos = 0;
              mutex_unlock(&file->f_dentry->d_inode->i_mutex);
              break;
    // 要求B核从0xff60 0000这个位置开始执行代码
       case CMD_COREB_START:
              spin_lock_irq(&coreb_lock);
              if (coreb_status & COREB_IS_RUNNING) {
                     retval = -EBUSY;
                     break;
              }
              printk(KERN_INFO "Starting Core B/n");
              coreb_status |= COREB_IS_RUNNING;
        // SICA_SYSCR中的CoreB_SRAM_INIT这位设置为0,也即允许B核开始执行
              bfin_write_SICA_SYSCR(bfin_read_SICA_SYSCR() & ~0x0020);
              SSYNC();
              spin_lock_irq(&coreb_lock);
              break;
#if defined(CONFIG_BF561_COREB_RESET)
    // 要求B核停止运行
       case CMD_COREB_STOP:
              spin_lock_irq(&coreb_lock);
              printk(KERN_INFO "Stopping Core B/n");
              // SICA_SYSCR中的CoreB_SRAM_INIT位设置为1
              bfin_write_SICA_SYSCR(bfin_read_SICA_SYSCR() | 0x0020);
              // SICB_SYSCR中的CB_supplement_int0位写1,要求B核产生中断1进行复位,复位后由于SICA_SYSCR中的CoreB_SRAM_INIT1B核将不再运行。
              bfin_write_SICB_SYSCR(bfin_read_SICB_SYSCR() | 0x0080);
              coreb_status &= ~COREB_IS_RUNNING;
              spin_lock_irq(&coreb_lock);
              break;
       // 要求B核复位
       case CMD_COREB_RESET:
              printk(KERN_INFO "Resetting Core B/n");
              bfin_write_SICB_SYSCR(bfin_read_SICB_SYSCR() | 0x0080);
              break;
#endif
       }
 
       return retval;
}
至于对read和write的处理则比较简单,主要要注意的就是:在读写时驱动程序将自动将FILE结构中的文件位置加上基地址后再进行读写,且读写不能超过每个块允许的大小,否则将读写失败,。如对0xff60 0000的读写就不能超过4K。
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

ucos 和uclinux的区别及各自的特点

uc/os和uclinux操作系统是两种性能优良源码公开且被广泛应用的的免费嵌入式操作系统,可以作为研究实时操作系统和非实时操作系统的典范。本文通过对uc/os和uclinux的对比,分析和总结了嵌入...
  • jc70100322
  • jc70100322
  • 2016年01月20日 19:17
  • 1769

终于将uClinux移植于fpga成功

刚刚上传图片失败,重来 历时两个星期,终于将uClinux移植于nios ii成功;激动的心情难以掩饰,高兴的同时,我希望记录下我的移植坎坷之旅:    首先我是按照真 OO无双的博客一...
  • frank_wff
  • frank_wff
  • 2014年12月24日 13:23
  • 923

编译uclinux下的应用程序和内核模块

编译uclinux下的应用程序和内核模块   目        录 编译uclinux下的应用程序和内核模块... 1 目       录... 1 实验环境... 1 编译应用程序的正确方法.....
  • pseraph
  • pseraph
  • 2013年08月23日 22:19
  • 1265

00002笔试题(JAVA)

1.JAVA中,以下()接口以键值对的形式存储对象。 A.java.util.Collection B.java.util.Map C.java.util.List D.j...
  • u012934325
  • u012934325
  • 2016年03月08日 22:52
  • 935

java中的IO各种读写流的学习

一、过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。  二、包装类:所谓包装类,就是可以直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会...
  • u014394609
  • u014394609
  • 2014年10月15日 21:36
  • 1014

常见前端面试题及答案

[综合面试] 常见前端面试题及答案 前言:本文是在GitHup上看到一个大牛总结的前端常见面试题,很多问题问的都很好,很经典、很有代表性。上面没有答案,我就整理了一下,从网上找了一些相关问题的答案。里...
  • sinat_21274091
  • sinat_21274091
  • 2015年10月06日 16:33
  • 1486

Shell脚本中的:>/dev/null 2>&1 的作用

转自:http://wangqiaowqo.iteye.com/blog/1354226 shell中可能经常能看到:>/dev/null 2>&1  命令的结果可以通过%>的形式来定...
  • yasi_xi
  • yasi_xi
  • 2013年03月05日 11:17
  • 19337

Shell重定向 &>file、2>&1、1>&2 、/dev/null的区别

在shell脚本中,默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入)、标准输出(输出到屏幕)、标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2 。 >  默认...
  • u011630575
  • u011630575
  • 2016年08月08日 15:07
  • 650

ARM内核中寄存器的浅见

ARM内核中寄存器
  • DennisGang
  • DennisGang
  • 2016年08月19日 16:47
  • 1081

ARM内核寄存器 两种状态 7种工作模式

ARM处理器工作模式一共有 7 种 : USR  模式     正常用户模式,程序正常执行模式 FIQ模式(Fast Interrupt Request)      处理快速中断,支持高速...
  • u014379540
  • u014379540
  • 2016年07月22日 15:39
  • 1643
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在uclinux for bf561中使用B核(2): /dev/coreb提供的功能
举报原因:
原因补充:

(最多只允许输入30个字)