forked from joninvski/ts_7500_kernel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathREADME
More file actions
139 lines (102 loc) · 3.91 KB
/
Copy pathREADME
File metadata and controls
139 lines (102 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
=====================================================
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;
}