Porting of Arm-Linux camera driver

Publisher:SparklingSunLatest update time:2016-08-13 Source: eefocusKeywords:Arm-Linux Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere
        There are two ways to transplant the camera on the Arm development board: first, add the driver to the kernel, compile the kernel, and burn it to the board; second, drive the hardware by dynamically loading the camera driver module. The author first transplants the camera driver on the Linux system of the PC to ensure that the driver version is correct, then compiles the driver into a module, mounts it to the board through the file system, and then loads it to create a camera device node. The following will specifically introduce the process of dynamic loading of the camera.

        The camera model used in the transplantation process is ZC301P, the kernel version on the arm board is 2.6.9, the development board is pxa270, and the driver package used is spca5xx-20060501.tar.gz.

      The first step is to decompress the file using the command: tar zxvf spca5xx-20060501.tar.gz

                   Enter spca5xx-20060501: cd spca5xx-20060501

       The second step is to modify the Makefile file: VERSION = 00.60.00

The contents of the Makefile are as follows, the commented out parts are in blue, and the modified parts are in red:

CC =arm-linux-gcc

LD =arm-linux-ld                          
CVSVERSION = "$Experimental work Michel Xhaard && Reza Jelveh 03/02/2004"
DEFINES =

###
# The following flags enable experimental features.
# By default, these are enabled for development versions of the driver, and
# disabled for release versions.

# Optional: Enable driver debugging
DEFINES += -DSPCA50X_ENABLE_DEBUG

# Optional: Enable direct register read/write for PAC207 development
#DEFINES += -DSPCA5XX_ENABLE_REGISTERPLAY

###
# The following flags enable features that aren't yet implemented, and
# therefore are disabled by default.

# Optional: Enable compression
DEFINES += -DSPCA50X_ENABLE_COMPRESSION

###
# Rest of Makefile follows here. You probably won't need to touch this.

# Setup defines
DEFINES += -DCONFIG_USB_SPCA5XX_MODULE=1 -DMODULE -D__KERNEL__
DEFINES += -DVID_HARDWARE_SPCA5XX=0xFF -DSPCA5XX_VERSION=\"$(VERSION)\"

ifneq ($(shell uname -r | cut -d. -f1,2), 2.4)

ifneq ($(KERNELLEASE),) # We were called by kbuild
CFLAGS += $(DEFINES) 
obj-m += spca5xx.o
spca5xx-objs := drivers/usb/spca5xx.o drivers/usb/spcadecoder.o

else # We were called from command line

#KERNEL_VERSION = `uname -r`

KERNEL_VERSION = 2.6.9

#KERNELDIR := /lib/modules/$(KERNEL_VERSION)/build
KERNELDIR := /up-techpxa270/kernel/linux-2.6.9

PWD := $(shell pwd)
#MODULE_INSTALLDIR = /lib/modules/$(KERNEL_VERSION)/kernel/drivers/usb/media/

MODULE_INSTALLDIR =/root/modules/

# Targets, don't change!
default:
 @echo ' Building SPCA5XX driver for 2.5/2.6 kernel.'
 @echo ' Remember: you must have read/write access to your kernel source tree.'
 $(MAKE) -C $( KERNELDIR) SUBDIRS=$(PWD) CC=$(CC) modules

install:
 mkdir -p $(MODULE_INSTALLDIR)
 rm -f $(MODULE_INSTALLDIR)spca50x.ko
 rm -f $(MODULE_INSTALLDIR)et61x.ko
 install -c -m 0644 spca5xx.ko $(MODULE_INSTALLDIR)
 /sbin/depmod -ae

uninstall:
 rm -f $(MODULE_INSTALLDIR)/spca5xx.ko
 /sbin/depmod -aq

endif

else # kernel version test

################################################ ##########################
# For Linux 2.4 users.
# Change the following lines according to your system configuration.
# It is imp ortant to configure your particular source tree ("make dep") before
# compiling this module!
################################ ##########################################
###
# This makefile will build the spca50x driver module external to the kernel
# source tree. It makes it easier to swap kernels.


#KERNEL_VERSION = `uname -r`

KERNEL_VERSION = 2.4.x

###
# Location of the header files (most imp ortantly the config files)
# for the kernel you want to build the module against.
# This should be correct for the currently installed kernel on your machine.
#KINCLUDE = /lib/modules /$(KERNEL_VERSION)/build/include

KINCLUDE =/up-techpxa270/kernel/linux2.4.x

KERNEL_ACFILE = $(KINCLUDE)/linux/autoconf.h
KERNEL_MODVERSIONSFILE = $(KINCLUDE)/linux/modversions.h
#MODULE_INSTALLDIR = /lib/modules/$(KERNEL_VERSION)/kernel/drivers/usb/

MODULE_INSTALLDIR =/root/modules/

# Detect module versioning support
ifneq ($(strip $(shell grep 'define CONFIG_MODVERSIONS 1' $(KERNEL_ACFILE))),)
 DEFINES += -DMODVERSIONS -include $(KERNEL_MODVERSIONSFILE)
endif

# Detect SMP support
ifneq ($(strip $(shell grep 'define CONFIG_SMP 1' $(KERNEL_ACFILE))),)
 DEFINES += -D__SMP__ -DSMP
endif

# Setup the tools
#CC = gcc
#LD = ld

CC =arm-linux-gcc

LD = arm-linux-gcc

# Setup compiler warnings
WARNINGS = -Wall -Wpointer-arith
WARNINGS += -Wcast-align -Wwrite-strings -Wstrict-prototypes
WARNINGS += -Wuninitialized -Wreturn-type -Wunused -Wparentheses

# Setup compiler flags
CFLAGS = -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe
CFLAGS += -mpreferred-stack-boundary=2 
CFLAGS += -I$(KINCLUDE) -Idrivers/usb

# Setup link flags
LDFLAGS = --strip-debug -r

# Setup the list of files to be included in a distribution
DIST_FILES = CHANGELOG \
             README \
             Makefile \
             drivers/usb/Config.in \
             drivers/usb/spcadecoder.c \
             drivers/usb/spcadecoder.h \
      drivers/usb/spcagamma. h \
      drivers/usb/spcaCompat.h \
      drivers/usb/spcausb.h \
             drivers/usb/spca500_init.h \
             drivers/usb/spca501_init.h \
      drivers/usb/sp5xxfw2.dat \
             drivers/usb/sp5xxfw2.h \
             drivers/usb/spca505_init.h \
             drivers/usb/spca506.h \
             drivers/usb/spca508_init.h \
      drivers/usb/spca561.h \
      drivers/usb/sonix.h \
             drivers/usb/cs2102.h \
             drivers/usb/hv7131b.h \
      drivers/usb/icm105a.h \
             drivers/usb/hv7131c.h \
      drivers/usb/hdcs2020.h \
             drivers/usb/pb0330.h \
      drivers/usb/tas5130c.h \
      drivers/ usb/zc3xx.h\
      drivers/usb/tv8532.h\
      drivers/usb/cxlib.h\
      drivers/usb/sn9cxxx.h\
      drivers/usb/cx11646.h\
      drivers/usb/pac207.h\
      drivers/usb/ spca5xx.c \
             drivers/usb/spca5xx.h

OBJS = drivers/usb/spcadecoder.o \
             drivers/usb/spca5xx.o

BINARY = spca5xx.o

###
# Targets follow here

binary: $(OBJS)
 @echo Linking $(BINARY)
 @$(LD) $(LDFLAGS) -o $(BINARY) $(OBJS)

install: binary
 @echo Installing.. Your root password may be required.
 su -c "make install-root"

install-root:
 @echo Installing..
 @mkdir -p /lib/modules/`uname -r`/kernel/drivers/usb
 @rm -f /lib/modules/`uname -r`/kernel/drivers/usb/ spca50x.o
 @rm -f /lib/modules/`uname -r`/kernel/drivers/usb/et61x.o
 @cp spca5xx.o /lib/modules/`uname -r`/kernel/drivers/usb/spca5xx .o
 @/sbin/depmod

dist: clean binary
 @echo Making distributable archives
 @rm -f spca5xx-src-$(VERSION).tar.gz
 @tar zcf spca5xx-src-$(VERSION).tar.gz $(DIST_FILES)
 @rm -f spca5xx- module-$(VERSION).tar.gz
 @cp $(BINARY) spca5xx-$(VERSION).o
 @tar zcf spca5xx-module-$(VERSION).tar.gz spca5xx-$(VERSION).o README
 @rm spca5xx-$(VERSION).o

.co: Makefile $*.c
 @echo Compiling $*.c
 @$(CC) $(CFLAGS) $(WARNINGS) $(DEFINES) -c $*.c -o $*.o

###
# Dependencies follow here

drivers/usb/spca5xx.o: drivers/usb/spca5xx.h \
         drivers/usb/spcaCompat.h \
         drivers/usb/spcausb.h \
         drivers/usb/sonix.h \
                       drivers/usb/spca500_init.h \
                       drivers/ usb/spca501_init.h \
         drivers/usb/sp5xxfw2.h \
                       drivers/usb/spca505_init.h \
         drivers/usb/spca506.h \
                       drivers/usb/spca508_init.h \
         drivers/usb/spca561.h \
         drivers/usb/ zc3xx.h\
         drivers/usb/tv8532.h\
         drivers/usb/cx11646.h\
         drivers/usb/mr97311.h\
         drivers/usb/sn9cxxx.h\
         drivers/usb/pac207.h\
                      

drivers/usb/spcadecoder.o: drivers/usb/spcadecoder.h \
      drivers/usb/spcagamma.h \
                         

endif #End kernel version test


################################################ ########################### 
# OTHER TARGETS 
################### ################################################ #########
clean:
 rm -r -f drivers/usb/*.o drivers/usb/.spcadecoder.o.cmd \
 drivers/usb/.spca5xx.o.cmd *.o *.ko *.mod.* .[az]* core *.i
 
################################################ ############################

A few notes on modifying the Makefile: 1. The Makefile is compiled into different target files for different kernels. The first part of the Makefile is for the 2.6 kernel, and the second part is for the 2.4 kernel. Users can modify it according to their own kernel. I modified the 2.6.9 kernel. 2.4.x means a certain version of 2.4, which is just a code name. Users can modify it according to their actual situation. 2. There are two main things to modify. One is that gcc becomes arm-linux-gcc; the other is the kernel path. Note that this is the kernel path of the cross-compilation environment, that is, the kernel path of arm-linux, not the kernel of the Linux system on the PC. 3. After the Makefile is modified, if your arm-linux has never been compiled, you need to compile the kernel first, and then make. MODULE_INSTALLDIR is the path where the module you compiled is placed. You don't need to change it. Of course, for convenience, it is best to change it to the folder you want, and the folder permissions should be changed to read and write.

Step 3: make

              After successful compilation, target files such as spca5xx.ko, spca5xx.o will be generated in the module MODULE_INSTALLDIR path.

Step 4: Mount your target file spca5xx.ko (2.6 kernel) or spca5xx.o (2.4 kernel) to the arm development board

Step 5: Enter the mounted folder on the development board and insmod spca5xx.ko

Step 6: Plug in the camera and test it

                If nothing unexpected happens, there will be a video0 device symbol under /dev/, or /dev/v4l/video0

Step 7: cat /dev/video0 > a.jpg to see if there is a file a.jpg

Press ctrl+C to exit, copy a.jpg to PC Linux and view it through gqview software, or you can write an image acquisition program, grab a frame and save it as a file, and then view it under PC Linux. It is troublesome to download gqview software, I wrote a small program to save the jpg file and view it under PC Linux.

It's very convenient to download and watch directly.

Of course, there are also accidents. After the camera driver is loaded, the camera cannot be used. The next article will introduce a special case. I was also stuck on this problem for a day or two, and asked a technical expert to solve it. There are many previous processes on the Internet. I will refine the process a little more for beginners to refer to and make progress together.     

Keywords:Arm-Linux Reference address:Porting of Arm-Linux camera driver

Previous article:Understanding LPC1752 Power-Down Mode
Next article:How to read and write Flash in ARM

Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号