linux kernel 摄像头驱动

1综合篇点我
2uboot移植点我
3uboot lcd驱动点我
4kernel移植点我
5kernel lcd驱动点我
6摄像头驱动点我
7ubuntu base移植点我
8挂载网络文件系统点我
9qt移植点我
10搭建qt交叉编译点我
11wifi移植点我

笔者所使用的ov5640摄像头,和Linux通信使用的是CSI和I2C协议

在这里插入图片描述

1 修改设备树

开发板摄像头接口原理图:

在这里插入图片描述

打开前面的imx6ull-user-emmc.dts文件
在i2c节点中添加

#address-cells = <1>;
#size-cells = <0>;        
ov5640: ov5640@3c {
	compatible = "ovti,ov5640";
	reg = <0x3c>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_csi1>;
	clocks = <&clks IMX6UL_CLK_CSI>;
	clock-names = "csi_mclk";
	pwn-gpios = <&gpio_spi 6 1>;
	rst-gpios = <&gpio_spi 5 0>;
	csi_id = <0>;
	mclk = <24000000>;
	mclk_source = <0>;
	status = "okay";    
	port {
		ov5640_ep: endpoint {
			remote-endpoint = <&csi1_ep>;
		};
	};
};  

![在这里插入图片描述](https://img-blog.csdnimg.cn/5416a23b0fdb45738996ae2e1148b33b.png

iomuxc的pinctrl_csi1子节点内容修改为:

pinctrl_csi1: csi1grp {
	fsl,pins = <
		MX6UL_PAD_CSI_MCLK__CSI_MCLK		0x1b088
		MX6UL_PAD_CSI_PIXCLK__CSI_PIXCLK	0x1b088
		MX6UL_PAD_CSI_VSYNC__CSI_VSYNC		0x1b088
		MX6UL_PAD_CSI_HSYNC__CSI_HSYNC		0x1b088
		MX6UL_PAD_CSI_DATA00__CSI_DATA02	0x1b088
		MX6UL_PAD_CSI_DATA01__CSI_DATA03	0x1b088
		MX6UL_PAD_CSI_DATA02__CSI_DATA04	0x1b088
		MX6UL_PAD_CSI_DATA03__CSI_DATA05	0x1b088
		MX6UL_PAD_CSI_DATA04__CSI_DATA06	0x1b088
		MX6UL_PAD_CSI_DATA05__CSI_DATA07	0x1b088
		MX6UL_PAD_CSI_DATA06__CSI_DATA08	0x1b088
		MX6UL_PAD_CSI_DATA07__CSI_DATA09	0x1b088

	>;
};

在这里插入图片描述

csi节点使用摄像头总线

&csi {
	status = "okay";

	port {
		csi1_ep: endpoint {
			remote-endpoint = <&ov5640_ep>;
		};
	};
};

在这里插入图片描述

2 修改kernel配置

打开 v4l2-core文件下的Kconfig文件

gedit drivers/media/v4l2-core/Kconfig 

找到 VIDEOBUF2_DMA_CONTIG 这个配置选项,可以看到这个选项虽然tristate类型,但是却没有说明语句,导致在menuconfig无法显示出来给我们配置,我们可以手动加入说明语句让它在menuconfig显示出来,也可以在下面添加"default y"默认编译进内核中

在这里插入图片描述

打开menuconfig配置选项

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

将V4L platform devices 的配置修改如下

-> Device Drivers
	-> <*> Multimedia support
		->[ * ]   V4L platform devices  ---> 
        	-> <*>   MXC Video For Linux Video Output                                                                                                
           	-> <*>   MXC Video For Linux Video Capture             
           		amera/V4L2 PRP Features support  --->            
           		 	-> <*> OmniVision ov5640 camera support                            
					-> < > OmniVision ov5642 camera support                                            
 					-> <*> OmniVision ov5640 camera support using mipi     
 					-> < > Analog Device adv7180 TV Decoder Input support                              
 				    -> <*> Select Overlay Rounting (Queue ipu device for overlay library)  --->       
 				    -> <*> Pre-processor Encoder library                           
 				    -> <*> IPU CSI Encoder library                                             
        	-> <*>   IPU v4l2 output support                    
        	-> <*>   MXC PxP V4L2 driver
        	-> <*>   CSI camera support                                                                                                              
        	-> <*>   OmniVision ov5640 camera support 

编译内核和设备树

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

在这里插入图片描述

编译成功
将zImage和imx6ull-user-emmc.dtb文件拷贝到挂载网络文件系统的文件夹下,设置网络文件系统可参考《挂载网络文件系统》这边文章

cp arch/arm/boot/zImage /home/work/imx6ull/rootfs/zImage/
cp arch/arm/boot/dts/imx6ull-user-emmc.dtb /home/work/imx6ull/rootfs/zImage/

给开发板重新上电进入系统

在这里插入图片描述

可以看到/dev/下连个两个video设备

3 v4l-utils工具安装

apt install v4l-utils

查看可用的视频设备,其中/dev/video0对应OV5640的物理设备

 #执行命令
 v4l2-ctl --list-devices

在这里插入图片描述

查看摄像头所有参数

 #执行命令
 sudo v4l2-ctl -d  /dev/video0 --all

在这里插入图片描述

查看摄像头所支持的分辨率

 #执行命令
 v4l2-ctl --list-formats-ext -d /dev/video0

在这里插入图片描述

4 安装gstreamer

可以使用gstreamer对摄像头做个简单测试,安装命令如下

apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools

#在LCD屏幕上显示摄像头的内容

gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)15/1" ! videoconvert ! fbdevsink

显示结果:

在这里插入图片描述

5 搭建mjpeg-streamer流媒体服务器

下载源码:https://github.com/chen3135/mjpg-streamer
在主机中下载好之后将文件拷贝到主机创建给开发板的挂载板网络文件系统中的opt下解压

在这里插入图片描述

解压之后得到的文件

在这里插入图片描述

解压之后回到网络文件系统的根目录

在这里插入图片描述

这里有一个主机挂载ubuntu base的脚本和退出挂载的脚本
mount.sh的内容

#/bin/bash
sudo mount -t proc /proc proc
sudo mount -t sysfs /sys sys
sudo mount -o bind /dev dev
sudo mount -o bind /dev/pts dev/pts
sudo chroot ./

unmount.sh的内容

#!/bin/bash
echo "UNMOUNTING"
sudo umount proc
sudo umount sys
sudo umount dev/pts
sudo umount dev

在主机中执行执行mount.sh挂载ubuntu base

在这里插入图片描述

给ubuntu base安装依赖库

apt-get install cmake libjpeg8-dev

在这里插入图片描述

进入mjpg-streamer-master

在这里插入图片描述

执行make

在这里插入图片描述

现在主机退出挂载

在这里插入图片描述

现在启动开发板,在开发板中进入/opt/mjpg-streamer-master

在这里插入图片描述

查看 start.sh的内容

vi start.sh 

查看发现里面只有这个语句是有用的

./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -u  -f 50" -o "./output_hh ttp.so -w ./www"

因为我的摄像头的格式是YUYV的格式,所以在我这里需要加上-y 1指定格式,否则会报错

-y 1 表示使用 V4L2_PIX_FMT_YUYV
-y 2 表示使用 V4L2_PIX_FMT_YVYU
-y 3 表示使用 V4L2_PIX_FMT_UYVV
-y 4 表示使用 V4L2_PIX_FMT_VYUY

在这里插入图片描述

执行start.sh脚本

在这里插入图片描述

我开发板的ip是192.168.4.108,在win11下用浏览器打开

http://192.168.4.108:8080/

就可以查看摄像头的内容了

在这里插入图片描述

  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
wen_ov5640_r16_20161114_1744后插入UVC可以打开ov5640和USB摄像头.7z 20161114全志R16配置为前ov5640后UVC的双摄像头 1、 Z:\home\wwt\uvc_r16_project\android\device\softwinner\astar-evb20\configs\camera.cfg 修改: number_of_camera = 1 为: number_of_camera = 2 如果不改这里,兄弟,你在camera这个APP里面是绝对看不到前后摄像头的切换选项的!!!!^_ 修改ov5640的分辨率: used_preview_size = 1 key_support_preview_size = 640x480 key_default_preview_size = 640x480 used_picture_size = 1 key_support_picture_size = 640x480 key_default_picture_size = 640x480 为(根据你驱动里面的摄像头的寄存器配置分辨率而实际修改): used_preview_size = 1 key_support_preview_size = 2592x1936, 2048x1536, 1600x1200, 1280x960, 1280x960, 1024x768, 1920x1080 ,1280x720, 800x600, 640x480 key_default_preview_size = 640x480 used_picture_size = 1 key_support_picture_size = 2592x1936, 2048x1536, 1600x1200, 1280x960, 1280x960, 1024x768, 1920x1080 ,1280x720, 800x600, 640x480 key_default_picture_size = 640x480 2、 Z:\home\wwt\uvc_r16_project\android\device\softwinner\astar-evb20\astar_evb20.mk #include device/softwinner/polaris-common/prebuild/google/products/gms_minimal.mk 注释掉这里干掉Google Play。可以不改。 3、这里讲UVC配置为模块了,请注意UVC所需要的模块的加载顺序。 Z:\home\wwt\uvc_r16_project\android\device\softwinner\astar-evb20\init.sun8i.rc 默认为: #csi module insmod /system/vendor/modules/videobuf-core.ko insmod /system/vendor/modules/videobuf-dma-contig.ko insmod /system/vendor/modules/cam_detect.ko # insmod /system/vendor/modules/actuator.ko # insmod /system/vendor/modules/ad5820_act.ko insmod /system/vendor/modules/cci.ko insmod /system/vendor/modules/vfe_os.ko insmod /system/vendor/modules/vfe_subdev.ko insmod /system/vendor/modules/gc0307.ko # insmod /system/vendor/modules/ov2035.ko insmod /system/vendor/modules/vfe_v4l2.ko 修改为: #csi module # /dev/video0 ov5640 insmod /system/vendor/modules/videobuf-core.ko insmod /system/vendor/modules/videobuf-dma-contig.ko #insmod /system/vendor/modules/cam_detect.ko insmod /system/vendor/modules/cci.ko insmod /system/vendor/modules/vfe_os.ko insmod /system/vendor/modules/vfe_subdev.ko insmod /system/vendor/modules/ov5640.ko insmod /system/vendor/modules/vfe_v4l2.ko # /dev/video1 uvc insmod /system/vendor/modules/videobuf2-core.ko insmod /system/vendor/modules/videobuf2-memops.ko insmod /system/vendor/modules/videobuf2-vmalloc.ko insmod /system/vendor/modules/uvcvideo.ko 4、 Z:\home\wwt\uvc_r16_project\lichee\tools\pack\chips\sun8iw5p1\configs\default\env.cfg 推荐修改: bootdelay=0 为: bootdelay=3 5、不用修改: Z:\home\wwt\uvc_r16_project\lichee\tools\pack\chips\sun8iw5p1\configs\evb-20\sys_config.fex ;-------------------------------------------------------------------------------- ;vip (video input port) configuration ;vip_used: 0:disable 1:enable ;vip_mode: 0:sample one interface to one buffer 1:sample two interface to one buffer ;vip_dev_qty: The quantity of devices linked to capture bus ; ;vip_define_sensor_list: If you want use sensor detect function, please set vip_define_sensor_list = 1, and ; verify that file /system/etc/hawkview/sensor_list_cfg.ini is properly configured! ; ;vip_dev(x)_pos: sensor position, "rear" or "front", if vip_define_sensor_list = 1,vip_dev(x)_pos must be configured! ; ;vip_dev(x)_isp_used 0:not use isp 1:use isp ;vip_dev(x)_fmt: 0:yuv 1:bayer raw rgb ;vip_dev(x)_stby_mode: 0:not shut down power at standby 1:shut down power at standby ;vip_dev(x)_vflip: flip in vertical direction 0:disable 1:enable ;vip_dev(x)_hflip: flip in horizontal direction 0:disable 1:enable ;vip_dev(x)_iovdd: camera module io power handle string, pmu power supply ;vip_dev(x)_iovdd_vol: camera module io power voltage, pmu power supply ;vip_dev(x)_avdd: camera module analog power handle string, pmu power supply ;vip_dev(x)_avdd_vol: camera module analog power voltage, pmu power supply ;vip_dev(x)_dvdd: camera module core power handle string, pmu power supply ;vip_dev(x)_dvdd_vol: camera module core power voltage, pmu power supply ;vip_dev(x)_afvdd: camera module vcm power handle string, pmu power supply ;vip_dev(x)_afvdd_vol: camera module vcm power voltage, pmu power supply ;x indicates the index of the devices which are linked to the same capture bus ;fill voltage in uV, e.g. iovdd = 2.8V, vip_devx_iovdd_vol = 2800000 ;fill handle string as below: ;axp22_eldo3 ;axp22_dldo4 ;axp22_eldo2 ;fill handle string "" when not using any pmu power supply ;-------------------------------------------------------------------------------- [csi0] vip_used = 1 vip_mode = 0 vip_dev_qty = 1 vip_define_sensor_list = 0 vip_csi_pck = port:PE00 vip_csi_mck = port:PE01 vip_csi_hsync = port:PE02 vip_csi_vsync = port:PE03 vip_csi_d0 = port:PE04 vip_csi_d1 = port:PE05 vip_csi_d2 = port:PE06 vip_csi_d3 = port:PE07 vip_csi_d4 = port:PE08 vip_csi_d5 = port:PE09 vip_csi_d6 = port:PE10 vip_csi_d7 = port:PE11 vip_csi_sck = port:PE12 vip_csi_sda = port:PE13 vip_dev0_mname = "ov5640" vip_dev0_pos = "rear" vip_dev0_lane = 1 vip_dev0_twi_id = 2 vip_dev0_twi_addr = 0x78 vip_dev0_isp_used = 0 vip_dev0_fmt = 0 vip_dev0_stby_mode = 1 vip_dev0_vflip = 0 vip_dev0_hflip = 0 vip_dev0_iovdd = "axp22_dldo3" vip_dev0_iovdd_vol = 2800000 vip_dev0_avdd = "" vip_dev0_avdd_vol = 2800000 vip_dev0_dvdd = "" vip_dev0_dvdd_vol = 1800000 vip_dev0_afvdd = "" vip_dev0_afvdd_vol = 2800000 vip_dev0_power_en = vip_dev0_reset = port:PE14 vip_dev0_pwdn = port:PE15 vip_dev0_flash_en = vip_dev0_flash_mode = vip_dev0_af_pwdn = [usbc1] usb_used = 1 usb_drv_vbus_gpio = port:PD12 usb_restrict_gpio = usb_host_init_state = 1 usb_restric_flag = 0 usb_regulator_io = "nocare" usb_regulator_vol = 0 usb_not_suspend = 0 编译内核之后, rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ ./build.sh config Welcome to mkscript setup progress All available chips: 0. sun8iw5p1 Choice: 0 All available platforms: 0. android 1. dragonboard 2. linux 3. tina Choice: 0 All available kernel: 0. linux-3.4 Choice: 0 All available boards: 0. bell-one 1. evb 2. evb-20 3. evb-rtl8723bs 4. sc3813r Choice: 2 rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ ./build.sh 配置USB摄像头为模块(也可以选择*直接编译进内核): rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ cd linux-3.4/ rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee/linux-3.4$ make ARCH=arm menuconfig Device Drivers ---> Multimedia support ---> [*] Video capture adapters ---> 修改: [ ] V4L USB devices ---> 为: [*] V4L USB devices ---> 修改: USB Video Class (UVC) (NEW) 为 USB Video Class (UVC) rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ cd linux-3.4/ rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee/linux-3.4$ cd .. rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ ./build.sh rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/lichee$ cd ../android/ rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/android$ source build/envsetup.sh including device/softwinner/bellone-sc3813r/vendorsetup.sh including device/softwinner/astar-evb20/vendorsetup.sh including device/softwinner/r16-bell-one/vendorsetup.sh including device/softwinner/astar-evb/vendorsetup.sh including device/softwinner/polaris-common/vendorsetup.sh including device/lge/mako/vendorsetup.sh including device/lge/hammerhead/vendorsetup.sh including device/samsung/manta/vendorsetup.sh including device/generic/x86/vendorsetup.sh including device/generic/mips/vendorsetup.sh including device/generic/armv7-a-neon/vendorsetup.sh including device/asus/tilapia/vendorsetup.sh including device/asus/deb/vendorsetup.sh including device/asus/grouper/vendorsetup.sh including device/asus/flo/vendorsetup.sh including sdk/bash_completion/adb.bash rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/android$ lunch You're building on Linux Lunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_x86-eng 3. aosp_mips-eng 4. vbox_x86-eng 5. bellone_sc3813r-eng 6. astar_evb20-eng 7. r16_bell_one-eng 8. astar_evb-eng 9. aosp_mako-userdebug 10. aosp_hammerhead-userdebug 11. aosp_manta-userdebug 12. mini_x86-userdebug 13. mini_mips-userdebug 14. mini_armv7a_neon-userdebug 15. aosp_tilapia-userdebug 16. aosp_deb-userdebug 17. aosp_grouper-userdebug 18. aosp_flo-userdebug Which would you like? [aosp_arm-eng] 6 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.4.2 TARGET_PRODUCT=astar_evb20 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a7 HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty HOST_BUILD_TYPE=release BUILD_ID=KVT49L OUT_DIR=out ============================================ rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/android$ extract-bsp rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/android$ make -j12 rootroot@cm-System-Product-Name:/home/wwt/uvc_r16_project/android$ pack 编译好系统之后,刷机之后请注意先让开发板的Android4.4启动完成之后再插入USB摄像头。 全志R16的android4.4启动之后再插入USB摄像头。 这个配置就可以设置 ov5640为后置摄像头:/dev/video0 UVC为前置摄像头:/dev/video1 如果接上USB摄像头再启动,android是被: ov5640为前置摄像头,有设备节点/dev/video1,打开失败。 UVC为后置摄像头:/dev/video0 原因未知。 参考资料: http://blog.csdn.net/u010257920/article/details/49925807 A20 linux(dragonboard)同时使用Parallel CSI Camera及UVC http://blog.csdn.net/guoyihoney/article/details/46966603 A20平台增加camera http://blog.csdn.net/it_fish_man/article/details/17395469 Android usb camera设备添加 http://blog.csdn.net/zmnqazqaz/article/details/49535531 RK3288 uvc摄像头调试 http://blog.csdn.net/edsam49/article/details/8886543 USB Camera在android车机上应用前景及初试小结
Android传感器MotionSensor开发实验 ⽬录 ⼀、实验⽬的 ⼀、实验⽬的 1. 了解Android开发 2. 掌握传感器调⽤ 3. 交互式界⾯设计 ⼆、实验要求 ⼆、实验要求 1) 搭建开发平台; 2)编写简单程序,实现按钮、屏幕操作的基本功能,应⽤程序下传安装在⼿机运⾏; 3)调⽤传感器,采集数据; 4)使⽤屏幕显⽰功能,实时显⽰采集的数据; 5)使⽤屏幕绘图功能,实时绘制采集的传感器数据; 6)使⽤对话框⽅式设置存储位置,保存数据; 7)实地测试,数据分析处理(根据实际数据情况,各⾃选⽤有效地⽅法) 三、实验原理 三、实验原理 (⼀)第⼀次实验 (⼀)第⼀次实验 本次实验我们将搭建开发平台,编写简单程序,实现按钮、屏幕操作的基本功能,应⽤程序下传安装在⼿机运⾏。我们需要搭建Android的 开发环境并开发⼀个按键交互⼩程序。下⾯我们⾸先介绍⼀下Android开发所需要⽤到的基础框架:JDK和Android SDK开发套件。 1.JDK(Java Development Kit) JAVA作为⼀款知名的编程语⾔,⾃⾯世以来⼀直⾮常的流⾏。在最近⼏年的编程语⾔排⾏榜上更是稳坐第⼀名的宝位。⽽Android系统在 开发之时也选择了JAVA作为其编程语⾔。JDK的全名叫做Java Development Kit JAVA开发包,从⽽为我们使⽤JAVA编程提供了相应的 环境以及类库。到⽬前为⽌,Java已经发展到了Java V8版,并在不断完善之中。⽽本次实验使⽤的Android开发均要使⽤JDK作为基础的 开发环境。 2.Android SDK Android SDK是⼀个为Android开发的软件包,它包含了调试器、API函数库、安卓模拟器以及⼀系列开发⽂档在内的各种⼯具。⾕歌官⽅ 开发出了基于Eclipse的ADT(Android Develop Tools)插件,通过为Eclipse安装插件的⽅式⽀持Android的开发,⽬前官⽅已经停⽌ADT 插件的开发与维护⼯作,并开发出了更加强⼤以及好⽤的Android Studio软件。本次实验则使⽤JDK+Android Studio的组合来开发 Android APP。 3.AVD(Android Virtual Devices) AVD就是运⾏于电脑上的安卓虚拟器,它可以使我们在没有⼿机的情况下通过电脑测试数据。 这与我们真实运⾏⼿机的情况⾮常相近。这样我们就可以⾮常⽅便的在电脑上调试程序。 4.Android 系统平台架构分析 系统平台架构分析 Android 平台由Linux内核、中间件、应⽤程序平台和应⽤软件组成,其系统架构如下图所⽰: 从图中我们可以看到整个安卓系统由Linux核⼼层、库、安卓运⾏时、应⽤程序框架以及应⽤层构成。⽽我们⼀般开发APP都在应⽤层进⾏ 开发。 a) Linux操作系统和驱动(Linux kernel): 由C语⾔实现。 Android核⼼系统服务依赖于Linux2.6内核,包括:安全性、内存管理、进程管理、⽹络协议、驱动模型。Linux内核也作 为硬件和软件栈之间的抽象层。除了标准的Linux内核外,Android还增加了内核的驱动程序:Binder(IPC)驱动、显⽰驱动、输⼊设备驱 动、⾳频系统驱动摄像头驱动、WiFi驱动、蓝⽛驱动、电源管理。 b) 程序库 (LIBRARIES) 程序库是指可供使⽤的各种标准程序、⼦程序、⽂件以及它们的⽬录等信息的有序集合,Android包含⼀些C/C++库,Android系统中不同的 组件通过应⽤程序框架可以使⽤这些库本地框架是有C/C++实现。包含C/C++库,被Android系统中不同组件使⽤,它们通过Android应 ⽤程序框架为开发者进⾏服务。 c) Java运⾏环境(ANDROIDRUNTIME) Android运⾏库包括两部分:⼀是核⼼库,⼆是⾃⾝的Dalvik虚拟机。 核⼼库提供Java编程语⾔核⼼库的⼤多数功能。 Dalvik虚拟机是Google专为Android开发的 。每⼀个Android应⽤程序都在⾃⼰的进程中运⾏,都拥有⼀个独⽴的Dalvik虚拟机实例。 d) Android应⽤框架(ANDROIDFRAMEWORK) 应⽤程序框架是指定义了⼀个应⽤程序运⾏所必须的全部功能组件,开发者也可以访问核⼼应⽤程序所使⽤的API框架。在Android系统中, 开发⼈员也可以完全访问核⼼应⽤程序所使⽤的API框架。 e) Android应⽤程序(APPLICATIONS) Android应⽤程序都是有Java语⾔编写的。⽤户开发的Android应⽤程序和Android的核⼼应⽤程序是同⼀层次的,它们都是基于Android 的系统API构建的。 (⼆)第⼆次实验 (⼆)第⼆
获取USB摄像头的1080p的JPEG格式的图片20180608_1806.7z 电脑上的系统:ubuntu14.04 // http://www.linuxidc.com/Linux/2011-03/33020.htm // V4L2摄像头获取单幅图片测试程序(MMAP模式) // [日期:2011-03-06] 来源:Linux社区 作者:aokikyon [字体:大 中 小] // // #加了点注释 // // #Rockie Cheng // printf #include #include // memset #include #include #include #include // close write usleep read #include #include #include #include #include #include // mmap #include #include #include #include // pthread_create pthread_join #include #define CLEAR(x) memset (&(x), 0, sizeof (x)) #define REQ_COUNT 6 #define uchar unsigned char struct buffer { void * start; size_t length; }; static char * dev_name = "/dev/video0";//摄像头设备名 static int fd = -1; struct buffer * buffers = NULL; // static unsigned int n_buffers = 0; // 2012-7-13 11:33 camera flag // static int iFlagCamera = 0; volatile int iFlagCamera = 0; // 函数名称:thread1 // 函数功能:用于接受键盘的输入,之后通知thread2抓图 // 参数列表: // 返回值 : void thread1(void) { char ch; printf("\n !!!!Warning!!!!\n Max 1000 color bmp\n Input the char: \n"); printf("\n !!!!press o an capture 1 frame picture! \n"); printf("\n !!!!press t an capture 10 frame picture! \n"); printf("\n !!!!press h an capture 100 frame picture! \n"); while(1) { while((ch=getchar()) != '\n') { printf("%c\n", ch); if('o'==ch) { iFlagCamera = 1; printf("thread1=%d\n", iFlagCamera); } else if('t'==ch) { iFlagCamera = 10; printf("thread1=%d\n", iFlagCamera); } else if('h'==ch) { iFlagCamera = 101; printf("thread1=%d\n", iFlagCamera); } else if('q'==ch) { iFlagCamera = 10001; printf("thread1=%d\n", iFlagCamera
移植Linux摄像头驱动需要以下步骤: 1.了解摄像头硬件的接口和协议,以及摄像头的型号和厂商信息。 2.下载并安装Linux内核源代码,确保内核版本与目标设备的内核版本相同。 3.编写摄像头驱动程序,包括初始化、打开、关闭、读取和写入等函数。 4.将驱动程序编译成内核模块或静态链接到内核中。 5.将编译好的驱动程序拷贝到目标设备上,并加载驱动程序。 6.测试驱动程序是否正常工作,包括摄像头是否能够被正确识别和使用。 以下是一个简单的示例,演示如何移植Linux摄像头驱动: 1.首先,需要了解摄像头硬件的接口和协议,以及摄像头的型号和厂商信息。 2.下载并安装Linux内核源代码,确保内核版本与目标设备的内核版本相同。 3.编写摄像头驱动程序,包括初始化、打开、关闭、读取和写入等函数。例如: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/usb.h> static struct usb_device_id my_usb_table[] = { { USB_DEVICE(0x1234, 0x5678) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, my_usb_table); static int my_usb_probe(struct usb_interface *interface, const struct usb_device_id *id) { printk(KERN_INFO "USB device (%04X:%04X) plugged\n", id->idVendor, id->idProduct); return 0; } static void my_usb_disconnect(struct usb_interface *interface) { printk(KERN_INFO "USB device removed\n"); } static struct usb_driver my_usb_driver = { .name = "my_usb_driver", .id_table = my_usb_table, .probe = my_usb_probe, .disconnect = my_usb_disconnect, }; static int __init my_usb_init(void) { return usb_register(&my_usb_driver);} static void __exit my_usb_exit(void) { usb_deregister(&my_usb_driver); } module_init(my_usb_init); module_exit(my_usb_exit); MODULE_LICENSE("GPL"); ``` 4.将驱动程序编译成内核模块或静态链接到内核中。例如: ```bash make -C /usr/src/linux M=$PWD modules ``` 5.将编译好的驱动程序拷贝到目标设备上,并加载驱动程序。例如: ```bash insmod my_usb_driver.ko ``` 6.测试驱动程序是否正常工作,包括摄像头是否能够被正确识别和使用。例如: ```bash dmesg | tail ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值