Linux下怎么访问phy层硬件的寄存器,以及如何使用驱动函数

yong_leave 2016-04-15 06:06:34
am335系列的开发板,网口芯片用的是dp83640,现在整个网络可以运行,但是我想修改dp83640芯片寄存器的内容,以及关于dp83640的驱动程序,该怎么弄,像字符设备我们可以用open函数来打开这个设备,再用write等函数进行操作,但是这个网口芯片没有设备名,只有网络设备节点eth0,我该怎么访问到dp83640呢.以及如何使用驱动里面的函数?请大神解答。
static struct phy_driver dp83640_driver = {
.phy_id = DP83640_PHY_ID,
.phy_id_mask = 0xfffffff0,
.name = "NatSemi DP83640",
.features = PHY_BASIC_FEATURES,
.flags = 0,
.probe = dp83640_probe,
.remove = dp83640_remove,
.config_aneg = genphy_config_aneg,
.read_status = genphy_read_status,
.hwtstamp = dp83640_hwtstamp,
.rxtstamp = dp83640_rxtstamp,
.txtstamp = dp83640_txtstamp,
.driver = {.owner = THIS_MODULE,}
};
...全文
398 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
cameratest12_grab_20161101_1440.tar.gz API接口的文件 R:\wyb\ov5640_parrot_r16_tinav2.0\package\allwinner\cameratest\src\cameratest.c R:\wyb\ov5640_parrot_r16_tinav2.0\package\allwinner\cameratest\src\videodev2.h 5.CSI接口的摄像头,用文工提供的方法,可以看到图片,但是我们仍然调用不了。因为文工提供的方法是Camera Test,我们仍然希望你们能提供一个从CSI接口获取图像的API接口函数。 CSI摄像头API接口,支持设置图像参数,支持捕捉图像帧数据。 API摄像头设置参数: 图像长:1280,640,320 图像高:720,480,240 R:\wyb\ov5640_parrot_r16_tinav2.0\lichee\linux-3.4\drivers\media\video\sunxi-vfe\device\ov5640.c static struct regval_list sensor_720p_regs[] = { //1280*720 static struct regval_list sensor_vga_regs[] = { //VGA: 640*480 由于驱动中没有320*240这个分辨率,建议直接通过软件取VGA: 640*480(横竖各隔一个点取一个),或者请OV提供QVGA(320*240)的寄存器配置。 例子给出来的是:640*480,可以很方便地修改为1280*720(生成的YUV的体积请做相应的修改)。 YUV格式现在配置为V4L2_PIX_FMT_NV12,也可以配置为其他格式,请根据需要配置。 修改: R:\wyb\ov5640_parrot_r16_tinav2.0\package\allwinner\cameratest\src\cameratest.c static int setVideoParams(void) { …… width1 = 640; height1 = 480; pixelformat1 = V4L2_PIX_FMT_NV12; } 亮度 [0,100] 对比度 [0,100] 饱和度 [0,100] 增益 [0,100] 曝光度 [1,100] 白平衡 [1,100] 通道 1 3, 默认1(灰度) 这些需要OV的FAE提供修改哪些寄存器,现阶段已经确认使用默认设置。 图像格式 RGB YUV,默认RGB ov5640默认出来的是YUV格式(cameratest中使用的是NV12),RGB请自行查找相关算法转换。 RGB和YUV.pdf 我找到的一个参考文档。YUYV格式转RGB格式。 https://www.douban.com/note/76361504/ RGB和YUV(请注意:这个算法适用于:V4L2_PIX_FMT_YUYV) 2.2.抓取图像信息,返回图像的内存地址。 测试步骤: 执行cameratest的时候,输入小写字母g回车。 程序的简要流程: command_thread1线程检测到g(grab)之后,通过iFlagGrab变量告知camera_thread2线程,将摄像头的当前帧图像放入到数组arrayVGANV12中。 已知会存在的效率问题: memcpy会消耗CPU资源!!!!如果对实时性要求不是特别高,调用memcpy是可以接受的。 如果对实时性要求特别高,建议直接把算法嵌入到capture_frame函数的相对应的位置。 void command_thread1(void) { …… while(1) { while((ch=getchar()) != '\n') { …… else if('g'==ch) { iFlagGrab = 1; printf("thread1=%d\n", iFlagGrab); // while(2==iFlagGrab) while(iFlagGrab) { if(2==iFlagGrab) { char image_name[30]; memset(image_name, 0, sizeof(image_name)); sprintf(image_name, "%s/grab_nv12d%s", "/tmp", iCameraCounter++, ".yuv"); // ret = save_frame_to_file(image_name, (void*)(vir_sub_start), width1, height1, pixelformat1, 1); int ret = save_frame_to_file(image_name, arrayVGANV12, width1, height1, pixelformat1, 1); iFlagGrab = 0; printf("****wyb %s:%d/%s()! \n", __FILE__, __LINE__, __func__); } else { usleep(2000); } } } } …… } static int capture_frame() { …… if(1==iFlagGrab) { //memcpy(d,s,(strlen(s)+1)); //buffers[buf.index].phy_addr = buf.m.offset - 0x20000000; memcpy( arrayVGANV12, buffers[buf.index].start, 640*480*3/2); iFlagGrab = 2; printf("****wyb %s:%d/%s()! iFlagGrab=%d\n", __FILE__, __LINE__, __func__, iFlagGrab); printf("****wyb %s:%d/%s()! 0xx buf.index=%d\n", __FILE__, __LINE__, __func__, buffers[buf.index].start, buf.index); //if(ret == 0){ // buffers[buf.index].phy_addr = buf.m.offset - 0x20000000; // hv_dbg("index: %d buffers[buf.index].start = %p\n", buf.index, buffers[buf.index].start); // do_save_sub_image(buf.index); // //SAVE_IMAGE--; // iFlagCamera--; //} } …… } 更多: V4L2方面的参考资料: Linux视频驱动接口V4L2视频采集编程.pdf Linux下V4L2编程小结--吴老师.doc 基于Linux视频驱动接口V4L2视频采集-初步完工.vsd (VISIO流程图)

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧