MIPS 平台下 I/O 端口的读写--以龙芯为例

本文介绍了MIPS架构下如何通过MMIO实现IO设备的读写操作,并以龙芯2E为例,详细展示了如何使用C语言访问特定的IO端口,包括8259A等常见控制器。

MIPS的IO读写一般情况都是通过MMIO来实现的,所有的IO device 的register都映射到memory中;并不像X86上的具有独立的编址:分成memory 总线和IO总线。两套独立的地址空间。

独立编址,统一编址的概念大概是: I/O地址空间与内存地址空间编址方式是否统一?例如8051为统一编址,I/O和存储器总计64K地址空间;X86为独立编址,分为I/O地址空间和memory地址空间。


---------------------------------------以下为转载部分---------------------------------------------------

MIPS 下,I/O 端口是直接映射到地址空间的,不像x86下有专用的 I/O 空间,使用专用的 in/out 指令访问之。

故而 MIPS 上访问 I/O 端口直接使用访存指令访问对应的地址即可。

但是各种控制器的寄存器映射到地址空间的何处,具体的平台就不一样了。下面以龙芯2E为例说明之。

龙芯2E 下使用 C语言读写 8259A 的 0x20 端口

char *p_port;
char data;

p_port = (char *)(0xbfd00000+0x20);   /* 64位模式下为 0xffff ffff bfd0 0000 */

data = *p_port;     /* read io port */

data |= 0x1;

*p_port = data;     /* write io port */


现龙芯2E的IO基地址映射在0xbfd00000(64位为0xffffffffbfd00000)处,为了和IBM PC的IO端口地址空间保持某种程度上的对应,常用的控制器的IO端口地址只要在原来的基础上加上这个基地址就可以了。

如8042 键盘控制器的0x60,0x61,0x64端口,CMOS RTC/RAM(兼容MC146818)的 0x70,0x71端口,8259a的0x20,0x21,0xa0,0xa1等等,现在loongson2e下访问之,只要加上0xbfd00000, 就是其IO地址。读写端口方式与内存读写方式一致。

另外,由于龙芯2E下IO地址空间映射在KSEG1(0xA0000000~0xC0000000),访问该地址空间需要在核心态下。


PS: 北桥bonito内的一些控制器映射在0xBFE00000处。

如 0xBFE00000+0x130 处映射为bonito之INTENSET寄存器

0xBFE00000+0x134 处映射为bonito之INTENCLR寄存器

0xBFE00000+0x138 处映射为bonito之INTEN寄存器

0xBFE00000+0x13c 处映射为bonito之INTISR寄存器

尚有INTEDGE(映射到0xBFE00124)、INTSTEER(映射到0xBFE00128)、INTPOL(映射到0xBFE0012C) 

详细用途参见: 《龙芯2E体系结构之异常、中断》
make[6]: Entering directory '/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/fv_focus_test' mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o fv_focus_test.o fv_focus_test.c mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o fv_data_model.o fv_data_model.c make[6]: Leaving directory '/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/fv_focus_test' if [ -f /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common/libmppcommon.a ]; then \ cp -fpR /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common/libmppcommon.a /home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/lib/nvmp/libs/; \ fi make[5]: Leaving directory '/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp' mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libavdc/libavdc.o libavdc/libavdc.c mips-linux-gnu-ar crus -o libavdc.a ./libavdc/libavdc.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/mpp_adapter.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/aeawb.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/video.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/video_api.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/rmem_calc.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/audio.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/aec.o mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libcamera/libadc.o libcamera/libadc.c mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libcamera/libcamera.o libcamera/libcamera.c mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libcamera/libimage.o libcamera/libimage.c mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libcamera/libosd.o libcamera/libosd.c mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libcamera/libcover.o libcamera/libcover.c mips-linux-gnu-ar crus -o libcamera.a ./libcamera/libadc.o ./libcamera/libcamera.o ./libcamera/libimage.o ./libcamera/libosd.o ./libcamera/libcover.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/camera_image.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/camera_osd.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/camera_cover.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/tpcam_osd.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/camera_gpio.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/camera_sar_adc.o mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libspeaker/libspeaker.o libspeaker/libspeaker.c mips-linux-gnu-ar crus -o libspeaker.a ./libspeaker/libspeaker.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/speaker.o mips-linux-gnu-ar crus -o isp_data_model.a /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/isp_data_model/image_profile_model.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/isp_data_model/audio_profile_model.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/isp_data_model/isp_data_model.o mips-linux-gnu-ar crus -o fv_focus_test.a /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/fv_focus_test/fv_data_model.o /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/fv_focus_test/fv_focus_test.o mips-linux-uclibc-gnu-gcc -Os -pipe -march=mips32r2 -g -ffunction-sections -fdata-sections -Wall -Werror -DWHITE_LAMP_SUPPORT -DCONFIG_WTL_GPIO_ACTIVE_LOW -DSENSOR_FRAME_RATE=100 -DSENSOR_FRAME_RATE_DEN=7 -DPTZ_SUPPORT -DAUDIO_DATA_MAX_THRESHOLD=12000 -DT31X_MPP -DAUDIO_ENABLE -DAUDIO_OUTPUT -DVIDEO_ENABLE -DJPEG_STREAM_ENABLE -DAUDIO_PLAY_AEC_SUPPORT -DINCREASE_VBR_BITRATE -DWHITE_LAMP_SUPPORT -DDN_SWITCH_CUSTOM_AREA_COMPENSATION -DDN_SWITCH_IR_CUT_DOUBLE_GPIO_CONTROL -DOSD_PIXEL_FORMAT_I2_SUPPORT -DAEC_DELAY_CLOSE_REF -DTP_AEC_CNG_MODE=0 -DTP_AEC_ECHO_MODE=1 -DTP_AEC_NS_MODE=1 -DFORBID_CAMERA_UNINIT_WHITE_PWM -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/include -I/home/wyl/NVMP/nvmp/../sdk/soc/t31x/uclibc-toolchain-0.9.33/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/include -I/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/avdc/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/camera/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/speaker/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/decrypt/include -I/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common -ffunction-sections -fdata-sections -c -o libjpeg_stream/libjpeg_stream.o libjpeg_stream/libjpeg_stream.c libjpeg_stream/libjpeg_stream.c:680:5: error: conflicting types for 'get_realtime_raw_jpeg' In file included from libjpeg_stream/libjpeg_stream.c:1:0: /home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include/libjpeg_stream.h:154:5: note: previous declaration of 'get_realtime_raw_jpeg' was here /home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/mpp/adapter/common/Makefile:12: recipe for target 'libjpeg_stream/libjpeg_stream.o' failed make[4]: *** [libjpeg_stream/libjpeg_stream.o] Error 1 make[4]: Leaving directory '/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp' Makefile:582: recipe for target '/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/.built' failed make[3]: *** [/home/wyl/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/libmpp/.built] Error 2 make[3]: Leaving directory '/home/wyl/NVMP/nvmp/tp_package/lib/libmpp' package/Makefile:105: recipe for target 'package/tp_package/lib/libmpp/compile' failed make[2]: *** [package/tp_package/lib/libmpp/compile] Error 2 make[2]: Leaving directory '/home/wyl/NVMP/nvmp' package/Makefile:101: recipe for target '/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/stamp/.package_compile' failed make[1]: *** [/home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/stamp/.package_compile] Error 2 make[1]: Leaving directory '/home/wyl/NVMP/nvmp' /home/wyl/NVMP/nvmp/include/toplevel.mk:277: recipe for target 'world' failed make: *** [world] Error 2
最新发布
09-20
你再次遇到了 **`conflicting types for 'get_realtime_raw_jpeg'`** 的编译错误。这次的上下文非常清晰,我们来彻底解决它。 --- ### ✅ 回答问题 #### 🔴 错误原因:函数声明与定义不一致 ``` libjpeg_stream/libjpeg_stream.c:680:5: error: conflicting types for 'get_realtime_raw_jpeg' In file included from libjpeg_stream/libjpeg_stream.c:1:0: /home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include/libjpeg_stream.h:154:5: note: previous declaration of 'get_realtime_raw_jpeg' was here ``` 这意味着: > 在头文件 `libjpeg_stream.h` 中有一个函数声明; > 在源文件 `libjpeg_stream.c` 中实现了同名函数; > 但两者的 **返回类型或参数列表不一致** → 编译器报错! --- ### 🧩 深入分析你的代码 你在前面提供过这个函数实现: ```c int get_realtime_raw_jpeg(PIC_CHN_E pic_chn, U32 align_size, PHOTO_INFO_S *photo) { ... } ``` 而根据错误提示,头文件中的原型是: ```c // /home/wyl/NVMP/nvmp/staging_dir/.../libjpeg_stream.h:154 int get_realtime_raw_jpeg(PIC_CHN_E pic_chn, U32 align_size, PHOTO_INFO_S *photo); ``` 看起来一样?那为什么还会冲突? 👉 真正的问题在于:**这些类型(如 `PIC_CHN_E`, `U32`, `PHOTO_INFO_S`)在两个文件中是否由相同的头文件定义?** 如果: - `.h` 文件用的是旧版本 SDK 定义, - `.c` 文件包含了新头文件或自定义定义, → 即使名字相同,C 编译器也会认为它们是“不同类型”,导致 **`conflicting types`**。 --- ### ✅ 正确修复方法(C语言代码 + 解释) #### ✅ 第一步:确保所有类型统一来自公共头文件 创建一个公共头文件,比如:`include/jpeg_types.h` ##### `jpeg_types.h` ```c #ifndef JPEG_TYPES_H #define JPEG_TYPES_H #include <stdio.h> #include <stdlib.h> // 基础类型 typedef unsigned char U8; typedef unsigned int U32; typedef int S32; // 图像通道枚举 typedef enum { PIC_CHN_JPEG = 0, PIC_CHN_THUMB, PIC_CHN_MAX } PIC_CHN_E; // 状态码 #ifndef OK #define OK 0 #endif #ifndef ERROR #define ERROR (-1) #endif // 日志宏 #define JPEG_STREAM_ERROR(fmt, ...) \ do { \ fprintf(stderr, "[JPEG] %s:%d: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__); \ } while(0) // JPEG 数据包头(假设) typedef struct { U32 magic; U32 frame_id; U32 timestamp; U32 reserved; } JPEG_HEADER_S; // 输出结构体 typedef struct { U8 *buf; U32 buf_len; } PHOTO_INFO_S; #endif // JPEG_TYPES_H ``` --- #### ✅ 第二步:更新头文件 `libjpeg_stream.h` ##### `libjpeg_stream.h` ```c #ifndef LIBJPEG_STREAM_H #define LIBJPEG_STREAM_H #include "jpeg_types.h" #ifdef __cplusplus extern "C" { #endif /** * 获取实时原始 JPEG 数据 */ int get_realtime_raw_jpeg(PIC_CHN_E pic_chn, U32 align_size, PHOTO_INFO_S *photo); #ifdef __cplusplus } #endif #endif // LIBJPEG_STREAM_H ``` --- #### ✅ 第三步:修改 `.c` 文件包含正确头文件 ##### `libjpeg_stream/libjpeg_stream.c` ```c #include "libjpeg_stream.h" // 包含主接口 #include "jpeg_types.h" // 或者通过 libjpeg_stream.h 间接包含 // 外部依赖(由 MPP 提供) extern void *g_jpeg_cursor[PIC_CHN_MAX]; int get_newest_jpeg(PIC_CHN_E pic_chn, void *cursor, void *unit); void release_a_jpeg(void *cursor, void *unit); // 缓冲区单元结构(内部使用) typedef struct { void *addr; U32 len; } rb_unit_t; // 实现函数 int get_realtime_raw_jpeg(PIC_CHN_E pic_chn, U32 align_size, PHOTO_INFO_S *photo) { rb_unit_t unit = {0}; if (pic_chn >= PIC_CHN_MAX || !photo) { JPEG_STREAM_ERROR("invalid pic_chn=%d or photo=NULL", pic_chn); return ERROR; } if (OK != get_newest_jpeg(pic_chn, &g_jpeg_cursor[pic_chn], &unit)) { return ERROR; } // 分配内存(考虑对齐) U32 data_len = unit.len > sizeof(JPEG_HEADER_S) ? unit.len - sizeof(JPEG_HEADER_S) : 0; U32 alloc_size = data_len; if (align_size > 0) { U32 pad = (align_size - (data_len % align_size)) % align_size; alloc_size += pad; } photo->buf = (U8*)calloc(1, alloc_size); if (!photo->buf) { release_a_jpeg(&g_jpeg_cursor[pic_chn], &unit); return ERROR; } memcpy(photo->buf, (U8*)unit.addr + sizeof(JPEG_HEADER_S), data_len); photo->buf_len = data_len; release_a_jpeg(&g_jpeg_cursor[pic_chn], &unit); return OK; } ``` --- ### ✅ 关键解释 | 问题 | 解决方式 | |------|----------| | 类型不一致(`PIC_CHN_E` 被重复定义) | 统一从 `jpeg_types.h` 包含 | | `PHOTO_INFO_S` 在 .h 和 .c 中定义不同 | 使用同一头文件避免重复定义 | | `-Werror` 导致中断 | 修复类型一致性后自动通过 | | 枚举和结构体作用域混乱 | 所有公共类型放入公共头文件 | --- ### ❗️常见陷阱排查清单 | 检查项 | 方法 | |-------|------| | 是否有两个 `libjpeg_stream.h`? | `find . -name libjpeg_stream.h` | | `.c` 文件是否包含正确的头文件? | 确保第一行是 `#include "libjpeg_stream.h"` | | `PIC_CHN_E` 是否在多个地方定义? | 全局搜索 `typedef enum.*PIC_CHN_E` | | 是否用了 `-I` 引入了旧头文件? | 检查编译命令中的路径顺序,优先级高的会覆盖低的 | | 静态库 `.a` 是否基于旧头文件编译? | 清理并重新构建整个 `libmpp` | --- ### ✅ 清理并重新编译 ```bash # 清理 mpp 模块 make package/tp_package/lib/libmpp/clean # 重新编译 make package/tp_package/lib/libmpp/compile V=99 ``` 确保新的头文件被复制到 staging 目录: ```bash cp include/libjpeg_stream.h /home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include/ cp include/jpeg_types.h /home/wyl/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/usr/include/ ``` --- ### ✅ 总结 | 问题 | 原因 | 解法 | |------|------|--------| | `conflicting types for 'get_realtime_raw_jpeg'` | 头文件与源文件中函数签名看似一致,但依赖的类型实际不同 | 统一类型定义来源 | | 编译失败于 `-Werror` | C 严格类型检查 | 使用公共头文件保证一致性 | | 内存泄漏风险 | `calloc` 后未释放 | 当前逻辑合理,调用方负责释放 `photo->buf` | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值