The patch is not matched to the videodevX-20011221.tgz sources (some of 
it reject, and when I checked they already appears in the file in some 
way).
Here is a fixed patch. I've compiled and insmoded it on PPC box. Not 
more yet.

bye,
Ilan

Justin Schoeman wrote:
> Ilan Finci wrote:
> 
>> Thanks,
>> I've looked at the code of do_div on PPC, and it uses % and /. Will it 
>> still work?
>>
>> Also, I tried to use do_div on i386 (kernel 2.4.18), and I get wrong 
>> answer. Attached is a small test program, where do_div is the version 
>> from the i386 sources, and do_div1 is the version from PPC sources.
>>
>> The first one give wrong answer, while the second one works fine. What 
>> am I missing? Will the code in v4l2 that uses do_div works on Intel 
>> platforms?
>>
>> Thanks,
>> Ilan
>>
>> Gerd Knorr wrote:
>>
>>>> /lib/modules/2.4.16/kernel/drivers/media/video/videodevX.o: 
>>>> unresolved symbol __udivdi3
>>>> /lib/modules/2.4.16/kernel/drivers/media/video/videodevX.o: 
>>>> unresolved symbol __umoddi3
>>>
>>>
>>>
>>>
>>> libgcc functions for 64bit math, which are not present in the kernel
>>> because it isn't linked against libgcc.
>>>
>>>
>>>> I see in videodevX.c that the function v4l2_math_div6432(...) I see 
>>>> that for intel cpus, there is an assembly code, and for others, a 
>>>> use of the '/' and '%', can this be the problem?
>>>
>>>
>>>
>>>
>>> Yes.
>>>
>>> The modules in http://bytesex.org/patches/12_v4l2-2.4.19-pre2.diff.gz
>>> have this fixed, they use the kernel functions for 64bit division.
>>>
>>>   Gerd
>>
> 
> 
> Attached is a completely untested patch (well, it does build...) for 
> videodevX, that adds Gerd's math routines.  Please give it a try, and 
> let me know if it works.
> 
> -justin
> 
> 
> ------------------------------------------------------------------------
> 
> diff -urN videodevX/videodev.h videodevX-newdiv/videodev.h
> --- videodevX/videodev.h      Thu Jun 14 07:45:23 2001
> +++ videodevX-newdiv/videodev.h       Thu Mar 14 10:58:56 2002
> @@ -879,9 +879,6 @@
>  extern void *v4l2_q_yank_node(struct v4l2_queue *q, struct v4l2_q_node *node);
>  extern int   v4l2_q_last(struct v4l2_queue *q);
>  
> -/*  Math functions  */
> -extern u32 v4l2_math_div6432(u64 a, u32 d, u32 *r);
> -
>  /*  Time functions  */
>  extern unsigned long v4l2_timestamp_divide(stamp_t t,
>                                          unsigned long p_100ns);
> diff -urN videodevX/videodevX.c videodevX-newdiv/videodevX.c
> --- videodevX/videodevX.c     Thu Jun 14 07:45:23 2001
> +++ videodevX-newdiv/videodevX.c      Thu Mar 14 11:03:42 2002
> @@ -42,19 +42,18 @@
>   * 2.4 devfs support ported from 2.4 kernels by
>   *  Dan Merillat <[EMAIL PROTECTED]>
>   * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman)
> + * Arch independant division hacked for Gerd Knor's v4l2 patch
>   */
>  
>  #ifndef __KERNEL__
>  #define __KERNEL__
>  #endif
>  
> -
>  #include <linux/config.h>
>  #ifndef EXPORT_SYMTAB
>  #define EXPORT_SYMTAB
>  #endif
>  
> -
>  #include <linux/version.h>
>  #include <linux/module.h>
>  #include <linux/types.h>
> @@ -66,13 +65,13 @@
>  #include <linux/errno.h>
>  #include "videodev.h"
>  
> -
>  #if LINUX_VERSION_CODE >= 0x020100
>  #include <asm/uaccess.h>
>  #endif
>  #include <asm/system.h>
>  #include <asm/pgtable.h>
>  #include <asm/io.h>
> +#include <asm/div64.h>
>  
>  #ifdef CONFIG_KMOD
>  #include <linux/kmod.h>
> @@ -1132,7 +1131,7 @@
>                              int count, int *eof, void *data)
>  {
>       int len = 0;
> -     struct videodev_proc_data *d;
> +     struct videodev_proc_data *d = NULL;
>       struct list_head *tmp;
>  
>       list_for_each (tmp, &videodev_proc_list) {
> @@ -1765,41 +1764,15 @@
>   *  Math functions
>   */
>  
> -u32
> -v4l2_math_div6432(u64 a, u32 d, u32 *r)
> -{
> -     u32 q, m;
> -#ifdef __i386__
> -/*  Danger: This function will fault if the quotient exceeds (1<<32) - 1  */
> -     __asm__ __volatile__ (
> -             "       movl %2,%%eax\n"
> -             "       movl %3,%%edx\n"
> -             "       divl %4\n"
> -             "       movl %%eax,%0\n"
> -             "       movl %%edx,%1\n"
> -             : "=g" (q), "=g" (m)
> -             : "g" ((u32)a), "g" ((u32)(a >> 32)), "g" (d)
> -             : "eax", "edx"
> -             );
> -#else
> -     q = a / d;
> -     m = a % d;
> -#endif
> -     if (r) *r = m;
> -     return q;
> -}
> -
>  unsigned long
>  v4l2_timestamp_divide(stamp_t t, unsigned long p_100ns)
>  {
> -     /*  Note: 't' is in 1ns units, 'p_100ns' is in 100ns units, */
> -     /*  and the quotient is rounded  */
> -     u64     p;
> -
> -     p = (u64)p_100ns * 100;  /* 1ns units */
> -     t >>= 6;      /*  /64 to allow p_100ns longer than 4 secs. */
> -     p >>= 6;  /*  to keep quotient the same  */
> -     return v4l2_math_div6432((u64)t + (p >> 1), (u32)p, NULL);
> +     u32 p;
> +     
> +     p = ((u64)p_100ns * 100) >> 6;
> +     t = (t >> 6) + (p >> 1);
> +     do_div(t,p);
> +     return t;
>  }
>  
>  /*  Force the timestamp to be an integer multiple of p_100ns  */
> @@ -1877,13 +1850,16 @@
>  unsigned long
>  v4l2_video_std_tpf(struct v4l2_standard *vs)
>  {
> -     return v4l2_math_div6432(
> -             (u64)vs->framerate.numerator * 10000000
> -             + vs->framerate.denominator / 2,
> -             vs->framerate.denominator,
> -             NULL);
> +     u64 a;
> +     u32 b;
> +     
> +     a = (u64)vs->framerate.numerator * 10000000 + vs->framerate.denominator / 2;
> +     b = vs->framerate.denominator;
> +     do_div(a,b);
> +     return a;
>  }
>  
> +
>  /*  Used only in v4l2_video_std_confirm()  */
>  static void
>  catc1p2e6(__u8 *s, char c, int n)
> @@ -2139,7 +2115,6 @@
>  EXPORT_SYMBOL(v4l2_q_peek_tail);
>  EXPORT_SYMBOL(v4l2_q_yank_node);
>  EXPORT_SYMBOL(v4l2_q_last);
> -EXPORT_SYMBOL(v4l2_math_div6432);
>  EXPORT_SYMBOL(v4l2_timestamp_divide);
>  EXPORT_SYMBOL(v4l2_timestamp_correct);
>  EXPORT_SYMBOL(v4l2_masterclock_register);


-- 
Ilan Finci
Engineering Manager
Advanced Technology Development
MobilEye Vision Technologies Ltd
24 Mishol Hadkalim st. Jerusalem, 97278, Israel
Tel: 972-2-5866989 ext. 105  Fax: 972-2-5867720 E-Fax: 1-801-912-3251
Email: mailto:[EMAIL PROTECTED]    http://www.mobileye.com
# This is a BitKeeper generated patch for the following project:
# Project Name: Video4Linux Two integration to the ACP4
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#       drivers/videodevX/videodevX.c   1.1     -> 1.4    
#       drivers/videodevX/videodev.h    1.1     -> 1.2    
diff -Nru a/drivers/videodevX/videodev.h b/drivers/videodevX/videodev.h
--- a/drivers/videodevX/videodev.h      Thu Mar 14 11:44:28 2002
+++ b/drivers/videodevX/videodev.h      Thu Mar 14 11:44:28 2002
@@ -886,9 +886,6 @@
 extern void *v4l2_q_yank_node(struct v4l2_queue *q, struct v4l2_q_node *node);
 extern int   v4l2_q_last(struct v4l2_queue *q);
 
-/*  Math functions  */
-extern u32 v4l2_math_div6432(u64 a, u32 d, u32 *r);
-
 /*  Time functions  */
 extern unsigned long v4l2_timestamp_divide(stamp_t t,
                                           unsigned long p_100ns);
diff -Nru a/drivers/videodevX/videodevX.c b/drivers/videodevX/videodevX.c
--- a/drivers/videodevX/videodevX.c     Thu Mar 14 11:44:28 2002
+++ b/drivers/videodevX/videodevX.c     Thu Mar 14 11:44:28 2002
@@ -42,19 +42,18 @@
  * 2.4 devfs support ported from 2.4 kernels by
  *  Dan Merillat <[EMAIL PROTECTED]>
  * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman)
+ * Arch independant division hacked for Gerd Knor's v4l2 patch
  */
 
 #ifndef __KERNEL__
 #define __KERNEL__
 #endif
 
-
 #include <linux/config.h>
 #ifndef EXPORT_SYMTAB
 #define EXPORT_SYMTAB
 #endif
 
-
 #include <linux/version.h>
 #include <linux/module.h>
 #include <linux/types.h>
@@ -66,13 +65,13 @@
 #include <linux/errno.h>
 #include "videodev.h"
 
-
 #if LINUX_VERSION_CODE >= 0x020100
 #include <asm/uaccess.h>
 #endif
 #include <asm/system.h>
 #include <asm/pgtable.h>
 #include <asm/io.h>
+#include <asm/div64.h>
 
 #ifdef CONFIG_KMOD
 #include <linux/kmod.h>
@@ -1155,7 +1154,7 @@
                               int count, int *eof, void *data)
 {
        int len = 0;
-       struct videodev_proc_data *d = 0;
+       struct videodev_proc_data *d = NULL;
        struct list_head *tmp;
 
        list_for_each (tmp, &videodev_proc_list) {
@@ -1791,41 +1790,15 @@
  *  Math functions
  */
 
-u32
-v4l2_math_div6432(u64 a, u32 d, u32 *r)
-{
-       u32 q, m;
-#ifdef __i386__
-/*  Danger: This function will fault if the quotient exceeds (1<<32) - 1  */
-       __asm__ __volatile__ (
-               "       movl %2,%%eax\n"
-               "       movl %3,%%edx\n"
-               "       divl %4\n"
-               "       movl %%eax,%0\n"
-               "       movl %%edx,%1\n"
-               : "=g" (q), "=g" (m)
-               : "g" ((u32)a), "g" ((u32)(a >> 32)), "g" (d)
-               : "eax", "edx"
-               );
-#else
-       q = a / d;
-       m = a % d;
-#endif
-       if (r) *r = m;
-       return q;
-}
-
 unsigned long
 v4l2_timestamp_divide(stamp_t t, unsigned long p_100ns)
 {
-       /*  Note: 't' is in 1ns units, 'p_100ns' is in 100ns units, */
-       /*  and the quotient is rounded  */
-       u64     p;
-
-       p = (u64)p_100ns * 100;  /* 1ns units */
-       t >>= 6;      /*  /64 to allow p_100ns longer than 4 secs. */
-       p >>= 6;  /*  to keep quotient the same  */
-       return v4l2_math_div6432((u64)t + (p >> 1), (u32)p, NULL);
+       u32 p;
+       
+       p = ((u64)p_100ns * 100) >> 6;
+       t = (t >> 6) + (p >> 1);
+       do_div(t,p);
+       return t;
 }
 
 /*  Force the timestamp to be an integer multiple of p_100ns  */
@@ -1903,13 +1876,16 @@
 unsigned long
 v4l2_video_std_tpf(struct v4l2_standard *vs)
 {
-       return v4l2_math_div6432(
-               (u64)vs->framerate.numerator * 10000000
-               + vs->framerate.denominator / 2,
-               vs->framerate.denominator,
-               NULL);
+       u64 a;
+       u32 b;
+       
+       a = (u64)vs->framerate.numerator * 10000000 + vs->framerate.denominator / 2;
+       b = vs->framerate.denominator;
+       do_div(a,b);
+       return a;
 }
 
+
 /*  Used only in v4l2_video_std_confirm()  */
 static void
 catc1p2e6(__u8 *s, char c, int n)
@@ -2165,7 +2141,6 @@
 EXPORT_SYMBOL(v4l2_q_peek_tail);
 EXPORT_SYMBOL(v4l2_q_yank_node);
 EXPORT_SYMBOL(v4l2_q_last);
-EXPORT_SYMBOL(v4l2_math_div6432);
 EXPORT_SYMBOL(v4l2_timestamp_divide);
 EXPORT_SYMBOL(v4l2_timestamp_correct);
 EXPORT_SYMBOL(v4l2_masterclock_register);

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to