Skip to content

cnm/ts7500_kernel

 
 

Repository files navigation

=====================================================
Go get the kernel at:

ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7500-linux/sources/

Then:

# make ts7500_defconfig #Removed as .config is included in the git repo (YOU NO LONGER NEED TO DO IT)

make
make modules
make modules_install

=====================================================

Version: linux-2.6.24-cavium_source_jun082011.tar.gz

=====================================================

Fred alterations were:
======================

In arch/arm/kernel/calls.S:

               CALL(sys_ni_syscall)
               CALL(sys_miavitasetseconds)
    /* 355 */  CALL(sys_miavitameansyscall)
               CALL(sys_miavitasyscall)        

In include/asm-arm/unistd.h:

    #define __MR_miavitasetseconds         (__NR_SYSCALL_BASE+354)
    #define __MR_miavitameansyscall        (__NR_SYSCALL_BASE+355)
    #define __NR_miavitasyscall            (__NR_SYSCALL_BASE+356)

In include/linux/miavita_xtime.h:

    #ifndef __MIAVITA_XTIME_H__
    #define __MIAVITA_XTIME_H__

    #include <linux/time.h>

    extern uint64_t __miavita_elapsed_secs, __miavita_elapsed_usecs;

    extern void init_miavita_xtime(void);
    extern void pulse_miavita_xtime(void);
    #endif


In include/linux/syscalls.h:

    asmlinkage int sys_miavitasetseconds(uint64_t secs);
    asmlinkage int sys_miavitameansyscall(uint64_t __user * res);
    asmlinkage int sys_miavitasyscall(uint64_t __user * res);

In ipc/Makefile:

    obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o miavita_syscall.o

In ipc/miavita_syscall.c:

    #include <linux/module.h>
    #include <linux/linkage.h>
    #include <linux/kernel.h>
    #include <asm/uaccess.h>
    #include <linux/errno.h>
    #include <linux/miavita_xtime.h>

    uint64_t __miavita_elapsed_secs = 0, __miavita_elapsed_usecs = 0, __last_diff = 0;
    EXPORT_SYMBOL(__miavita_elapsed_secs);
    EXPORT_SYMBOL(__miavita_elapsed_usecs);

    void init_miavita_xtime(void){
      struct timeval t;
      do_gettimeofday(&t);
      printk("FIRST MICROS %ld\n", t.tv_usec);
      __miavita_elapsed_usecs = t.tv_usec;
      printk("STORED MICROS %lld\n", __miavita_elapsed_usecs);
    }
    EXPORT_SYMBOL(init_miavita_xtime);

    void pulse_miavita_xtime(void){
      struct timeval t;
      uint64_t temp_t;

      do_gettimeofday(&t);

      if(__miavita_elapsed_secs != 0){
        temp_t = t.tv_usec;
        if(temp_t < __miavita_elapsed_usecs)
          temp_t += 1000000;
        __last_diff = (temp_t - __miavita_elapsed_usecs);
      }

      __miavita_elapsed_usecs = t.tv_usec;
      __miavita_elapsed_secs++;
    }
    EXPORT_SYMBOL(pulse_miavita_xtime);

    /*
     * Mia-Vita's syscall to know microseconds from gps.
     * This must return the seconds with microsecond precision.
     */
    asmlinkage int sys_miavitasyscall(uint64_t __user * res){
      struct timeval t;
      int64_t check;
      unsigned long ret;
      do_gettimeofday(&t);
      if( ((uint64_t) t.tv_usec) < __miavita_elapsed_usecs)
       t.tv_usec += 1000000;    

      check = __miavita_elapsed_secs * 1000000 + (( (uint64_t)t.tv_usec ) - __miavita_elapsed_usecs) ;
      if(check < 0)
        printk(KERN_EMERG "Don't know how but i'm returnning a negative value %lld = %llu + (%llu - %llu)\n", check, __miavita_elapsed_secs * 1000000, (uint64_t)t.tv_usec, __miavita_elapsed_usecs);

      ret = copy_to_user(res, &check, sizeof(uint64_t));
      if(ret){
        printk(KERN_EMERG "Copy_to_user failed with %lu not copied.\n", ret);
        return -ENOMEM;
      }

      return 0;
    }

    asmlinkage int sys_miavitameansyscall(uint64_t __user * res){
      unsigned long ret;
      ret = copy_to_user(res, &__last_diff, sizeof(uint64_t));
      if(ret){
        printk(KERN_EMERG "Copy_to_user failed with %lu bytes not copied.\n", ret);
        return -ENOMEM;
      }

      return 0; 
    }

    asmlinkage int sys_miavitasetseconds(uint64_t secs){
      __miavita_elapsed_secs = secs;
      return 0;
    }

About

Kernel for the ts-7500 devices

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 94.1%
  • Assembly 3.3%
  • C++ 2.3%
  • Objective-C 0.2%
  • Perl 0.1%
  • Shell 0.0%