source "drivers/kvm/Kconfig"
+#add for LEON-MJPEG prj.
+source "drivers/kmjpeg/Kconfig"
+
endmenu
obj-$(CONFIG_DMA_ENGINE) += dma/
obj-$(CONFIG_HID) += hid/
obj-$(CONFIG_PPC_PS3) += ps3/
+obj-$(CONFIG_KMJPEG) += kmjpeg/
--- /dev/null
+#
+# Kuri Mjpeg configuration
+#
+
+menu "KURI mjpeg support"
+
+config KURI_HELLO
+ bool "kuri_hello trial driver"
+ ---help---
+ For the driver compiling trial
+
+comment "Kuri Hello sample"
+
+config KMJPEG
+ bool "Push data to mjpeg IP"
+ ---help---
+ push data to original mjpeg IP block
+
+comment "Kuri Mjpeg"
+
+
+endmenu
--- /dev/null
+obj-$(CONFIG_KURI_HELLO) += kuri_hello.o
+obj-$(CONFIG_KMJPEG) += kmjpeg.o
+
--- /dev/null
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/cdev.h>
+#include <linux/sched.h>
+#include <asm/current.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+
+#include <linux/io.h>
+#include <linux/ioport.h>
+
+#include <linux/interrupt.h>
+#include <linux/fcntl.h>
+#include <linux/slab.h>
+
+#include "kmjpeg.h"
+
+MODULE_LICENSE("GPL");
+
+#define DRIVER_NAME "kmjpeg"
+
+#define AHBADD 0xa0000000
+#define RDYADD 0xa0000200
+#define APBADD 0x80000c00
+
+
+/* Physical address for NEEK
+#define AHBADD 0xb0000000
+#define RDYADD 0xb0000200
+#define APBADD 0x80000700
+*/
+
+static struct kmjpeg_priv *kmjpeg_devices;
+
+static unsigned int kmjpeg_major = 0;
+module_param(kmjpeg_major, uint, 0);
+
+struct kmjpeg_sregs_t {
+ volatile unsigned int fbadd;
+ volatile unsigned int size_info;
+ volatile unsigned int inc_add;
+ volatile unsigned int reset;
+};
+
+struct kmjpeg_sregs_t * kmjpeg_sregs;
+
+//volatile unsigned int *apb_regs;
+
+volatile unsigned int *hdata;
+volatile unsigned int *rdyadd;
+
+int kmjpeg_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
+{
+ int retval = 0;
+
+ struct ioctl_cmdreg datareg;
+ struct ioctl_cmdwrite datawrite;
+
+ unsigned int tmp;
+ int i;
+
+ memset(&datareg, 0, sizeof(datareg));
+ memset(&datawrite, 0, sizeof(datawrite));
+
+
+ retval = 0;
+ switch(cmd){
+
+ case IOCTL_WRITE :
+ if(!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))){
+ retval = -EFAULT;
+ goto done;
+ }
+ if(copy_from_user(&datawrite, (int __user *)arg, sizeof(datawrite))){
+ retval = -EFAULT;
+ goto done;
+ }
+
+ while(1){
+ tmp = *rdyadd;
+ if((tmp & 0x80000000) == 0x80000000)break;
+ for(i=0;i<800;i++);
+ }
+ *hdata = datawrite.pixeldata;
+ // for(i=0;i<256;i++){
+ // *hdata = data4b.fourbdata[i];
+ // for(j=0;j<100000;j++);
+ // }
+ break;
+
+ case IOCTL_REGSET :
+ // printk("IOCTL_REGSET\n");
+ if(!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))){
+ retval = -EFAULT;
+ printk("ACCESS_NG\n");
+ goto done;
+ }
+ // printk("end of access_ok\n");
+ if(copy_from_user(&datareg, (int __user *)arg, sizeof(datareg))){
+ retval = -EFAULT;
+ printk("COPY_NG\n");
+ goto done;
+ }
+ // printk("IOCTL regset ..............................\n");
+ kmjpeg_sregs = ioremap_nocache(APBADD,12);
+ // printk("IOCTL regset2 ..............................\n");
+ kmjpeg_sregs->fbadd = datareg.fb;
+ kmjpeg_sregs->size_info = datareg.size_info;
+ kmjpeg_sregs->inc_add = datareg.inc_add;
+ kmjpeg_sregs->reset = 0x0;
+ kmjpeg_sregs->reset =0xffffffff;
+ iounmap(kmjpeg_sregs);
+ // printk("IOCTL regset3 ..............................\n");
+
+ break;
+
+ default :
+ retval = -EFAULT;
+ break;
+ }
+ done :
+ return(retval);
+}
+
+ssize_t kmjpeg_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
+{
+ int retval = 0;
+ unsigned int ycc;
+ unsigned char dbuf[3];
+
+ if(count != 3){
+ retval = -EFAULT;
+ goto out;
+ }
+ if(copy_from_user(dbuf, buf, 3)){
+ retval = -EFAULT;
+ goto out;
+ }
+ ycc = (unsigned int)(((unsigned int)dbuf[2]<<16)|((unsigned int)dbuf[1]<<8)|((unsigned int)dbuf[0]));
+ *hdata = ycc;
+ retval = count;
+ out:
+ return(retval);
+}
+
+static ssize_t kmjpeg_read(struct file* pFile, char __user* pBuf, size_t len, loff_t* offset)
+{
+ return 0;
+}
+
+
+
+
+static int kmjpeg_open(struct inode *inode, struct file *file)
+{
+
+ printk("%s: major %d minor %d (pid %d)\n", __func__,imajor(inode),iminor(inode),current->pid);
+
+ inode->i_private = inode;
+ file->private_data = file;
+ printk(" i_private=%p private_data=%p\n",inode->i_private, file->private_data);
+ // printk("kmjpeg_open ending\n");
+ return 0;
+}
+
+static int kmjpeg_close(struct inode *inode, struct file *file)
+{
+ printk("%s: major %d minor %d (pid %d)\n", __func__,imajor(inode),iminor(inode),current->pid);
+ printk(" i_private=%p private_data=%p\n",inode->i_private, file->private_data);
+
+ return 0;
+}
+
+struct file_operations kmjpeg_fops ={
+ .owner = THIS_MODULE,
+ .open = kmjpeg_open,
+ .release = kmjpeg_close,
+ .read = kmjpeg_read,
+ .write = kmjpeg_write,
+ .ioctl = kmjpeg_ioctl,
+};
+
+ static int kmjpeg_init(void)
+{
+ int major;
+ int ret = 0;
+
+ major = register_chrdev(kmjpeg_major, DRIVER_NAME, &kmjpeg_fops);
+
+ if((kmjpeg_major > 0 && major != 0) || (kmjpeg_major == 0 && major < 0) || major < 0){
+ printk("%s driver registration error\n", DRIVER_NAME);
+ ret = major;
+ goto error;
+ }
+ if (kmjpeg_major == 0){
+ kmjpeg_major = major;
+ }
+
+ hdata = ioremap_nocache(AHBADD,4);
+ if(hdata==NULL){
+ printk("ioremap miss!\n");
+ return(0);
+ }
+ rdyadd = ioremap_nocache(RDYADD,4);
+ if(rdyadd==NULL){
+ printk("ioremap miss!\n");
+ return(0);
+ }
+ printk("%s driver[major %d] installed.\n", DRIVER_NAME, kmjpeg_major);
+
+ error:
+ return(ret);
+}
+
+static void kmjpeg_exit(void)
+{
+ iounmap(hdata);
+ iounmap(rdyadd);
+ // kfree(kmjpeg_devices);
+
+ unregister_chrdev(kmjpeg_major, DRIVER_NAME);
+ printk("%s driver unloaded\n", DRIVER_NAME);
+}
+
+module_init(kmjpeg_init);
+module_exit(kmjpeg_exit);
--- /dev/null
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/cdev.h>
+#include <linux/sched.h>
+#include <asm/current.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+
+#include <linux/io.h>
+#include <linux/ioport.h>
+
+#include <linux/interrupt.h>
+#include <linux/fcntl.h>
+#include <linux/slab.h>
+
+#include "kmjpeg.h"
+
+MODULE_LICENSE("GPL");
+
+#define DRIVER_NAME "kmjpeg"
+
+#define AHBADD 0xa0000000
+#define RDYADD 0xa0000200
+#define APBADD 0x80000c00
+
+
+/* Physical address for NEEK
+#define AHBADD 0xb0000000
+#define RDYADD 0xb0000200
+#define APBADD 0x80000700
+*/
+
+static struct kmjpeg_priv *kmjpeg_devices;
+
+static unsigned int kmjpeg_major = 0;
+module_param(kmjpeg_major, uint, 0);
+
+struct kmjpeg_sregs_t {
+ volatile unsigned int fbadd;
+ volatile unsigned int size_info;
+ volatile unsigned int inc_add;
+ volatile unsigned int reset;
+};
+
+struct kmjpeg_sregs_t * kmjpeg_sregs;
+
+//volatile unsigned int *apb_regs;
+
+volatile unsigned int *hdata;
+volatile unsigned int *rdyadd;
+
+int kmjpeg_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
+{
+ int retval = 0;
+
+ struct ioctl_cmdreg datareg;
+ struct ioctl_cmdwrite datawrite;
+
+ unsigned int tmp;
+ int i;
+
+ memset(&datareg, 0, sizeof(datareg));
+ memset(&data4b, 0, sizeof(datawrite));
+
+
+ retval = 0;
+ switch(cmd){
+
+ case IOCTL_WR4BYTE :
+ if(!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))){
+ retval = -EFAULT;
+ goto done;
+ }
+ if(copy_from_user(&datawrite, (int __user *)arg, sizeof(datawrite))){
+ retval = -EFAULT;
+ goto done;
+ }
+
+ while(1){
+ tmp = *rdyadd;
+ if(tmp == 0x80000000)break;
+ for(i=0;i<800;i++);
+ }
+ *hdata = datawrite.pixeldata;
+ // for(i=0;i<256;i++){
+ // *hdata = data4b.fourbdata[i];
+ // for(j=0;j<100000;j++);
+ // }
+ break;
+
+ case IOCTL_REGSET :
+ // printk("IOCTL_REGSET\n");
+ if(!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))){
+ retval = -EFAULT;
+ printk("ACCESS_NG\n");
+ goto done;
+ }
+ printk("end of access_ok\n");
+ if(copy_from_user(&datareg, (int __user *)arg, sizeof(datareg))){
+ retval = -EFAULT;
+ printk("COPY_NG\n");
+ goto done;
+ }
+ printk("IOCTL regset ..............................\n");
+ kmjpeg_sregs = ioremap_nocache(APBADD,12);
+ printk("IOCTL regset2 ..............................\n");
+ kmjpeg_sregs->fbadd = datareg.fb;
+ kmjpeg_sregs->size_info = datareg.size_info;
+ kmjpeg_sregs->inc_add = datareg.inc_add;
+ kmjpeg_sregs->reset = 0x0;
+ kmjpeg_sregs->reset =0xffffffff;
+ iounmap(kmjpeg_sregs);
+ printk("IOCTL regset3 ..............................\n");
+
+ break;
+
+ default :
+ retval = -EFAULT;
+ break;
+ }
+ done :
+ return(retval);
+}
+
+ssize_t kmjpeg_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
+{
+ int retval = 0;
+ unsigned int ycc;
+ unsigned char dbuf[3];
+
+ if(count != 3){
+ retval = -EFAULT;
+ goto out;
+ }
+ if(copy_from_user(dbuf, buf, 3)){
+ retval = -EFAULT;
+ goto out;
+ }
+ ycc = (unsigned int)(((unsigned int)dbuf[2]<<16)|((unsigned int)dbuf[1]<<8)|((unsigned int)dbuf[0]));
+ *hdata = ycc;
+ retval = count;
+ out:
+ return(retval);
+}
+
+static ssize_t kmjpeg_read(struct file* pFile, char __user* pBuf, size_t len, loff_t* offset)
+{
+ return 0;
+}
+
+
+
+
+static int kmjpeg_open(struct inode *inode, struct file *file)
+{
+
+ printk("%s: major %d minor %d (pid %d)\n", __func__,imajor(inode),iminor(inode),current->pid);
+
+ inode->i_private = inode;
+ file->private_data = file;
+ printk(" i_private=%p private_data=%p\n",inode->i_private, file->private_data);
+ // printk("kmjpeg_open ending\n");
+ return 0;
+}
+
+static int kmjpeg_close(struct inode *inode, struct file *file)
+{
+ printk("%s: major %d minor %d (pid %d)\n", __func__,imajor(inode),iminor(inode),current->pid);
+ printk(" i_private=%p private_data=%p\n",inode->i_private, file->private_data);
+
+ return 0;
+}
+
+struct file_operations kmjpeg_fops ={
+ .owner = THIS_MODULE,
+ .open = kmjpeg_open,
+ .release = kmjpeg_close,
+ .read = kmjpeg_read,
+ .write = kmjpeg_write,
+ .ioctl = kmjpeg_ioctl,
+};
+
+ static int kmjpeg_init(void)
+{
+ int major;
+ int ret = 0;
+
+ major = register_chrdev(kmjpeg_major, DRIVER_NAME, &kmjpeg_fops);
+
+ if((kmjpeg_major > 0 && major != 0) || (kmjpeg_major == 0 && major < 0) || major < 0){
+ printk("%s driver registration error\n", DRIVER_NAME);
+ ret = major;
+ goto error;
+ }
+ if (kmjpeg_major == 0){
+ kmjpeg_major = major;
+ }
+
+ hdata = ioremap_nocache(AHBADD,4);
+ if(hdata==NULL){
+ printk("ioremap miss!\n");
+ return(0);
+ }
+ rdyadd = ioremap_nocache(RDYADD,4);
+ if(rdyadd==NULL){
+ printk("ioremap miss!\n");
+ return(0);
+ }
+ printk("%s driver[major %d] installed.\n", DRIVER_NAME, kmjpeg_major);
+
+ error:
+ return(ret);
+}
+
+static void kmjpeg_exit(void)
+{
+ iounmap(hdata);
+ iounmap(rdyadd);
+ // kfree(kmjpeg_devices);
+
+ unregister_chrdev(kmjpeg_major, DRIVER_NAME);
+ printk("%s driver unloaded\n", DRIVER_NAME);
+}
+
+module_init(kmjpeg_init);
+module_exit(kmjpeg_exit);
--- /dev/null
+#include <linux/ioctl.h>
+
+struct ioctl_cmdwrite{
+ unsigned int pixeldata;
+ // unsigned int fourbdata[256];
+};
+struct ioctl_cmdreg{
+ unsigned int fb;
+ unsigned int size_info;
+ unsigned int inc_add;
+};
+
+#define IOC_MAGIC 'k'
+
+#define IOCTL_REGSET _IOW(IOC_MAGIC, 1, struct ioctl_cmdreg)
+#define IOCTL_WRITE _IOW(IOC_MAGIC,2, struct ioctl_cmdwrite)
+
+
--- /dev/null
+#include <linux/ioctl.h>
+
+struct ioctl_cmdw4b{
+ unsigned int fourbdata[256];
+};
+struct ioctl_cmdreg{
+ unsigned int fb;
+ unsigned int size_info;
+ unsigned int inc_add;
+};
+
+#define IOC_MAGIC 'k'
+
+#define IOCTL_REGSET _IOW(IOC_MAGIC, 1, struct ioctl_cmdreg)
+#define IOCTL_WR4BYTE _IOW(IOC_MAGIC,2, struct ioctl_cmdw4b)
+
+
--- /dev/null
+#include <linux/module.h>
+#include <linux/init.h>
+
+MODULE_LICENSE("GPL");
+
+static int kurihello_init(void)
+{
+ printk(KERN_ALERT "KURI driver loaded\n");
+ return 0;
+}
+
+static void kurihello_exit(void)
+{
+ printk(KERN_ALERT "KURI driver unloaded\n");
+}
+
+module_init(kurihello_init);
+module_exit(kurihello_exit);
#include <sys/mman.h>
#include <sys/ioctl.h>
-#include<sys/time.h>
+#include <sys/time.h>
+#include "kmjpeg.h"
static int f_num = 0;
+//#define DEBUG
/*
{
// int xres,yres,vbpp,line_len,yfac;
long int screensize;
+ struct ioctl_cmdreg regset;
+ unsigned int size,inc;
+ int i;
/** V1 framebuffer & motionJPEG support **/
if(!(cinfo->fd_framebuffer = open( "/dev/fb0", O_RDWR))){
fprintf(stderr, "Framebuffer xsize:%d, ysize:%d, vbpp:%d\n",
cinfo->fb_vinfo.xres, cinfo->fb_vinfo.yres, cinfo->fb_vinfo.bits_per_pixel);
#endif
+ if(cinfo->fb_vinfo.xres % 16 != 0 || cinfo->fb_vinfo.yres % 16 != 0){
+ fprintf(stderr, "This system support only multiple of 16 X,Y size Framebuffer.\n");
+ exit(1);
+ }
+ if(cinfo->fb_vinfo.bits_per_pixel != 16){
+ fprintf(stderr, "This system support only 16 bits per pixel Framebuffer\n");
+ exit(1);
+ }
screensize = cinfo->fb_vinfo.xres * cinfo->fb_vinfo.yres * cinfo->fb_vinfo.bits_per_pixel / 8;
cinfo->fbptr = (char *)mmap(0,screensize,PROT_READ | PROT_WRITE, MAP_SHARED,cinfo->fd_framebuffer,0);
if((int)(cinfo->fbptr) == -1){
exit(1);
}
cinfo->fb_yinc = cinfo->fb_vinfo.bits_per_pixel / 8;
+
+ /* access IP core */
+ printf("setting up hardware\n");
+ cinfo->dev_fd = open("/dev/kmjpeg", O_RDWR);
+ if(cinfo->dev_fd == -1){
+ printf("kmjpeg device file open error\n");
+ exit(1);
+ }
+ regset.fb = cinfo->fb_start_add;
+ size = (unsigned int)((cinfo->image_width) <<16 | (unsigned int)(cinfo->image_height));
+ regset.size_info = size;
+ inc = (unsigned int)(cinfo->fb_vinfo.xres - cinfo->image_width)*2;
+ regset.inc_add = inc;
+#ifdef DEBUG
+ printf(stderr, "ioctl fb_start_add = %x, size_info = %x, inc_add = %x\n");
+ for(i=0;i<10000;i++);
+#endif
+ ioctl(cinfo->dev_fd, IOCTL_REGSET, ®set);
}
/* Targa output format. */
requested_fmt = FMT_TARGA;
+ } else if (keymatch(arg, "fb_add", 1)) {
+ /* Set Framebuffer address */
+ unsigned int xval;
+
+ if (++argn >= argc) /* advance to next argument */
+ usage();
+ if (sscanf(argv[argn], "%x", &xval) != 1)
+ usage();
+ cinfo->fb_start_add = xval;
+
} else {
usage(); /* bogus switch */
}
(void) jpeg_read_header(&cinfo, TRUE);
/* Adjust default decompression parameters by re-parsing the options */
- file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);
+ file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);
/* Initialize the output module now to let it override any crucial
* option settings (for instance, GIF wants to force color quantization).
#include "jinclude.h"
#include "jpeglib.h"
+#include "kmjpeg.h"
static int call_num = 0;
unsigned int pixcoldata;
unsigned int temppix;
long int location;
+ struct ioctl_cmdwrite writedata;
while (--num_rows >= 0) {
inptr0 = input_buf[0][input_row];
cb = GETJSAMPLE(inptr1[col]);
cr = GETJSAMPLE(inptr2[col]);
/* Range-limiting is essential due to noise introduced by DCT losses. */
- outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
+ /* outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
outptr[RGB_GREEN] = range_limit[y +
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
SCALEBITS))];
outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
-
+ */
/* V1 LEON-motionJPEG project */
- if(col%2 == 0){
+ /* if(col%2 == 0){
temppix =( ((outptr[RGB_RED]&0xf8)<<8) | ((outptr[RGB_GREEN]&0xfc)<<3) | ((outptr[RGB_BLUE]&0xf8)>>3));
}else{
pixcoldata = temppix << 16 |( ((outptr[RGB_RED]&0xf8)<<8) | ((outptr[RGB_GREEN]&0xfc)<<3) | ((outptr[RGB_BLUE]&0xf8)>>3));
location = ((col-1) * cinfo->fb_yinc) + (call_num) * cinfo->fb_finfo.line_length ;
- *((unsigned int *)(cinfo->fbptr + location)) = pixcoldata;
- }
+ *((unsigned int *)(cinfo->fbptr + location)) = pixcoldata;
+ }*/
+ /*LEON-motionJPEG prj for hard IP : yccrgbs*/
+ pixcoldata =(unsigned int)( y <<16 | cb <<8 | cr);
+ writedata.pixeldata = pixcoldata;
+ ioctl(cinfo->dev_fd, IOCTL_WRITE, &writedata);
outptr += RGB_PIXELSIZE;
}
}
long int fb_screensize;
char *fbptr;
int fb_yinc;
+
+ /* add for yccrgbs version */
+ unsigned int fb_start_add;
+ int dev_fd;
};
--- /dev/null
+../../linux-2.6.21.1/drivers/kmjpeg/kmjpeg.h
\ No newline at end of file