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
# 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
# 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.
Previous article:Understanding LPC1752 Power-Down Mode
Next article:How to read and write Flash in ARM
- Popular Resources
- Popular amplifiers
- Learn ARM development(16)
- Learn ARM development(17)
- Learn ARM development(18)
- Embedded system debugging simulation tool
- A small question that has been bothering me recently has finally been solved~~
- Learn ARM development (1)
- Learn ARM development (2)
- Learn ARM development (4)
- Learn ARM development (6)
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- LED chemical incompatibility test to see which chemicals LEDs can be used with
- Application of ARM9 hardware coprocessor on WinCE embedded motherboard
- What are the key points for selecting rotor flowmeter?
- LM317 high power charger circuit
- A brief analysis of Embest's application and development of embedded medical devices
- Single-phase RC protection circuit
- stm32 PVD programmable voltage monitor
- Introduction and measurement of edge trigger and level trigger of 51 single chip microcomputer
- Improved design of Linux system software shell protection technology
- What to do if the ABB robot protection device stops
- ASML predicts that its revenue in 2030 will exceed 457 billion yuan! Gross profit margin 56-60%
- Detailed explanation of intelligent car body perception system
- How to solve the problem that the servo drive is not enabled
- Why does the servo drive not power on?
- What point should I connect to when the servo is turned on?
- How to turn on the internal enable of Panasonic servo drive?
- What is the rigidity setting of Panasonic servo drive?
- How to change the inertia ratio of Panasonic servo drive
- What is the inertia ratio of the servo motor?
- Is it better for the motor to have a large or small moment of inertia?
- What exactly is op amp noise?
- [Hua Diao Experience] 11 Getting Started with ESP32C3
- 【GD32E503 Review】 Experiment on displaying Chinese characters and character strings
- Analog Discovery 2 Review (1) DIY or buy?
- I bought a Juyang JY-E2300 emulator on Xianyu, but it lacks an emulation head. Does anyone have an emulation head or schematic diagram for this emulator?
- This week's highlights
- 7.4V battery charge management IC?
- TI z-stack's OSAL multi-task scheduling mechanism
- Sensor question
- [National Technology Low Power Series N32L43x Review] 1. Development Board Unboxing